我的XML文件如下所示:
<A>
<file>data1</file>
<path>data2</path>
</A>
<B>
<file>data3</file>
<path>data4</path>
</B>
因此,我从日志文件中读取数据,对其进行解析并获取A
,B
,file
和path
等标记。现在我使用for循环迭代每个外部标记,然后与每个子标记进行比较,以查看XML文件中是否存在数据。
$data = $xml->XMLin("xmlfile");
foreach $e ( $data->{$outerTag} ) # outertag could be A, B
{
if( $e->{file} eq $fname ) { do_something } else { return 0; }
if( $e->{path} eq $pname ) { do_something } else { return 0; }
}
有没有办法让我不必使用for
循环。说我可以做这样的事情(我正在做这件事):
if( $data->{$outerTag}->{$fname} ) { do_something } else { return 0; }
答案 0 :(得分:2)
Perl没有官方的“XML解析器”;有很多options to choose from,有些比其他更好,具体取决于应用程序。
您可能想要了解XML validation using schemas。简而言之,您需要为您认为有效的XML编写模式,然后根据它验证XML文件。
答案 1 :(得分:2)
只要XML::Simple
为您的数据构建了合理的结构,您就可以编写
if ( $data->{$outerTag}{file} eq $fname ) { ... }
但是,根据您对数据的处理方式,最好使用更好的XML解析器,例如XML::LibXML
。
答案 2 :(得分:1)
现在大多数基于标准的XML模式验证器都是基于Java或Python的: - (
我建议使用xmllint,你也可以查看XMLLint perl module。
$ xmllint --noout --schema schema.xml data.xml
data.xml validates
<data>
<A>
<file>data1</file>
<path>data2</path>
</A>
<B>
<file>data3</file>
<path>data4</path>
</B>
</data>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0">
<xsd:element name="data" type="dataType"/>
<xsd:complexType name="dataType">
<xsd:sequence>
<xsd:element name="A" type="AType"/>
<xsd:element name="B" type="BType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="BType">
<xsd:sequence>
<xsd:element name="file" type="xsd:string"/>
<xsd:element name="path" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="AType">
<xsd:sequence>
<xsd:element name="file" type="xsd:string"/>
<xsd:element name="path" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
注意:强>