有没有办法使用Perl和XML :: Simple快速验证数据

时间:2012-06-05 18:21:58

标签: xml perl xml-parsing

我的XML文件如下所示:

<A>
 <file>data1</file>
 <path>data2</path>
</A>

<B>
  <file>data3</file>
  <path>data4</path>
</B>

因此,我从日志文件中读取数据,对其进行解析并获取ABfilepath等标记。现在我使用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; }

3 个答案:

答案 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.xml中

<data>
  <A>
    <file>data1</file>
    <path>data2</path>
  </A>
  <B>
    <file>data3</file>
    <path>data4</path>
  </B>
</data>

schema.xml中

<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>

注意: