our
$VERSION
=
'1.16.0'
;
XML::LibXML->
require
;
@EXPORT
=
qw(groups_xml)
;
our
$schema_file
=
<<"XSD";
<xsd:element name="configuration">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="unbounded" name="group">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="server" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:anyAttribute processContents="lax"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute use="required" name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XSD
sub
xml_validate {
my
$xmldoc
=
shift
;
my
$schema
= XML::LibXML::Schema->new(
string
=>
$schema_file
);
eval
{
$schema
->validate(
$xmldoc
); 1 }
or
die
"Could not validate XML file against the XSD schema: $@"
;
}
sub
groups_xml {
my
$file
=
shift
;
my
$parser
= XML::LibXML->new();
my
$xmldoc
=
$parser
->parse_file(
$file
);
my
%groups
;
xml_validate(
$xmldoc
);
foreach
my
$server_node
(
$xmldoc
->findnodes(
'/configuration/group/server'
) )
{
my
(
$group
) =
map
{
$_
->getValue() }
grep
{
$_
->nodeName eq
'name'
}
$server_node
->parentNode->attributes();
my
%atts
=
map
{
$_
->
nodeName
=>
$_
->getValue() }
$server_node
->attributes();
push
(
@{
$groups
{
$group
} },
Rex::Group::Entry::Server->new(
name
=>
delete
(
$atts
{name} ),
%atts
)
);
}
group(
$_
=> @{
$groups
{
$_
} } )
foreach
(
keys
(
%groups
) );
}
1;