0

私の XML ファイルは次のようになります。

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

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

そこで、ログ ファイルからデータを読み取り、解析してA、 、Bfileなどのタグを取得します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; }
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

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>

ノート:

于 2012-06-05T20:00:54.810 に答える