0

我的 XML 文件如下所示:

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

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

所以我从日志文件中读取数据,对其进行解析并获取标签,如A,和. 现在我使用 for 循环遍历每个外部标记,然后与每个子标记进行比较以查看数据是否存在于 XML 文件中。Bfilepath

$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; }
4

3 回答 3

2

Perl 没有官方的“XML 解析器”;有很多选项可供选择,根据应用程序,有些选项比其他选项更好。

您可能想阅读有关使用模式进行 XML 验证的信息。简而言之,您需要为您认为有效的 XML 编写一个模式,然后根据它验证 XML 文件。

于 2012-06-05T18:49:10.313 回答
2

只要XML::Simple为您的数据建立了合理的结构,您就可以编写

if ( $data->{$outerTag}{file} eq $fname ) { ... }

但是,根据您要对数据执行的操作,您最好使用更好的 XML 解析器,例如XML::LibXML.

于 2012-06-05T18:50:26.230 回答
1

现在大多数基于标准的 XML 模式验证器都是基于 Java 或 Python 的:-(

我建议使用 xmllint,您也可以查看XMLLint perl module

例子

$ xmllint --noout --schema schema.xml data.xml
data.xml validates

数据.xml

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

架构.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>

笔记:

于 2012-06-05T20:00:54.810 回答