2012-03-29 12 views
1

現在、受信するXMLリクエストをXML::Simpleで解析するPerl CGIスクリプトがあります。次のように入ってくるXMLの規則は次のとおりです。XMLで動的なネストされた値のペアにアクセスする

<?xml version="1.0" encoding="utf-8" ?> 
<XMLRequest> 
    <CORE> 
    <CORE ID="14"> 
     <PARENT_ID>1</PARENT_ID> 
     <CORE_ID>14</CORE_ID> 
     <FORM_ID>1423</FORM_ID> 
     <SECURITY_ID>1</SECURITY_ID> 
     <AREA_ID>3</AREA_ID> 
     <SUB_PARENT_ID>1</SUB_PARENT_ID> 
     <SUB_AREA_ID>1</SUB_AREA_ID> 
    </CORE> 
    <CORE ID="15"> 
     <PARENT_ID>1</PARENT_ID> 
     <CORE_ID>15</CORE_ID> 
     <FORM_ID>1424</FORM_ID> 
     <SECURITY_ID>1</SECURITY_ID> 
     <AREA_ID>3</AREA_ID> 
     <SUB_PARENT_ID>1</SUB_PARENT_ID> 
     <SUB_AREA_ID>2</SUB_AREA_ID> 
    </CORE> 
    </CORE> 
</XMLRequest> 

私は名前のコンポーネントは「コア」と「ID」の値である値であり、名前/値ペアにし、大会から取得する必要があります。しかし、このコンベンションでは、「CORE」は可能な値の変化するリストを表しています。 ASの場合、XMLinはそのXMLを解析し、最上位と2次の 'CORE'はハッシュですが、 'ID'と残りのデータはハッシュの配列として解釈します。

私は、XML :: SimpleのKeyAttrオプションを使用して、値に対して 'CORE'の可能なバリエーションをすべて列挙しているという点から見てきましたが、これは変更可能なリストなので実行できません。もう一つは、ネストされたWhilesとForステートメントを使用して必要なコンポーネントに到達しているだけですが、直感的ではありません。私はXML :: LibXMLを見て始めましたが、少しジャンプするのは難しいようです。

大変感謝しています。

+0

、見出力、(各CORE COREノードの子ノード、XmlRequestノードの子ノード) – BigMike

+0

XMLの変更方法を説明してください。 ''要素は異なるタグ名を持つことができますか?外側の ''要素は常に内側のものと同じ名前ですか?単に 'ID'属性を持つすべての要素がほしいと思いますか? – Borodin

答えて

2

XML::Simpleは単純なものよりも扱いにくいことがわかります.XXX DOMにアクセスするためのXPath式にアクセスするには、XML::LibXMLまたはXML::Twigに進むことを強くお勧めします。

ここでは、あなたのXMLに欲しいと思うことを実行するためのコードがあります。 ID属性を持つルート<XMLRequest>要素の2レベル下のすべての要素を検索し、その要素のタグ名とそのID属性値を報告します。あなたが見ているように、それはわずか2行で行われます。

use strict; 
use warnings; 

use XML::LibXML; 

my $xml = XML::LibXML->load_xml(string => <<XML); 
<?xml version="1.0" encoding="utf-8" ?> 
<XMLRequest> 
    <CORE> 
    <CORE ID="14"> 
     <PARENT_ID>1</PARENT_ID> 
     <CORE_ID>14</CORE_ID> 
     <FORM_ID>1423</FORM_ID> 
     <SECURITY_ID>1</SECURITY_ID> 
     <AREA_ID>3</AREA_ID> 
     <SUB_PARENT_ID>1</SUB_PARENT_ID> 
     <SUB_AREA_ID>1</SUB_AREA_ID> 
    </CORE> 
    <CORE ID="15"> 
     <PARENT_ID>1</PARENT_ID> 
     <CORE_ID>15</CORE_ID> 
     <FORM_ID>1424</FORM_ID> 
     <SECURITY_ID>1</SECURITY_ID> 
     <AREA_ID>3</AREA_ID> 
     <SUB_PARENT_ID>1</SUB_PARENT_ID> 
     <SUB_AREA_ID>2</SUB_AREA_ID> 
    </CORE> 
    </CORE> 
</XMLRequest> 
XML 

foreach my $node ($xml->findnodes('/XMLRequest/*/*[@ID]')) { 
    printf "%s => %d\n", $node->nodeName, $node->getAttribute('ID'); 
} 

COREノードは/ XMLRequest/CORE/COREで選択される場合には、あなたのlibにサポートXPath式ならばはMMMは、XPath/XQueryのジョブを思わ

CORE => 14 
CORE => 15 
+0

ありがとうございました!これは本当にトリックでした! – Namuna

関連する問題