2016-05-18 20 views
0

以下のxmlファイルについては、xpathを使用して書籍IDの値を抽出するにはどうすればよいですか?私は次のコードを使用していますxpathで親ノードの属性値を抽出する方法は?

<catalog> 
    <book id="bk101"> 
    <author>Gambardella, Matthew</author> 
    <title>XML Developer's Guide</title> 
    <genre>Computer</genre> 
    <price> 
     <amount>25</amount> 
     <tax>12</tax> 
     <total>37</total> 
    </price> 
    <publish_date>2000-10-01</publish_date> 
    <description>An in-depth look at creating applications with XML</description> 
    </book> 
</catalog> 

REGISTER hdfs:///user/iahlu/piggy.jar ; 

DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath(); 

A = LOAD '/user/iahlu/books.xml' using org.apache.pig.piggybank.storage.XMLLoader('book') as (x:chararray); 


B = FOREACH A GENERATE XPath(x, 'book/price/amount'),XPath(x,'/book/price/../@id'); 
dump B; 

をしかし、私の出力は量を抽出し、idフィールドは空白のままです。コードでは何が分かりませんか?

(25,) 
(23,) 
(27,) 
(21,) 
(31,) 
+0

こんにちは、あなたは '// book/@ id'または '// catalog/book/@ id'をロケータとして試しましたか? –

答えて

1

id<book>の属性であるので、あなたは、シンプルなXPathを使用することができるはずです。

book/@id 

あなたが試みたXPathの中核問題の可能性が高いbook/です。 XPathの先頭にある/は、常にドキュメントノードを参照します。したがって、あなたのケースでは、bookがルート要素ノードの場合、またはルートからbookへのフルパスを記述した場合は、/catalog/book/price/../@idのようになります。これを修正するには、上記の最初のXPathに示すように/を削除するか、または.を追加して、現在のコンテキストノード:./book/@idを基準にしてください。

+0

ありがとうございます。上記の両方のオプション(./book/@idとbook/@ id)を試してみてください。同じ出力が得られます。 id値は抽出されません。 – cielgris

関連する問題