2016-05-02 13 views
2

XML文書を解析するためにUDFを使用しようとしています。私は次のことを実行した場合、それが動作します:名前空間と一緒にハイブXPath UDFが動作しない

select xpath_string('<Application><applicationId>test</applicationId></Application>', '//applicationId') as id 
from my_table limit 2; 

出力は次のとおりです。

OK 
test 
test 

今私は、次のコードを実行しますが、名前空間を追加した場合、私は私のXMLを解析することができません。

select xpath_string('<Application xmlns="http://domain.com/test"><applicationId>test</applicationId></Application>', '//applicationId') as id 
from my_table limit 2; 

空の文字列のみを取得します。

私が間違っていることはありますか?または、XPathを改善する必要がありますか?

ありがとうございます!

答えて

4

第二XMLは、既定の名前空間が宣言された要素だけでなく、applicationId要素を含む接頭辞なしすべての子孫の要素だけではなく、影響を与えるデフォルトの名前空間、導入されています。一般的に

xmlns="http://domain.com/test" 

を、あなたはマップする必要があります接頭辞、例えばdをデフォルト名前空間uriに追加し、その接頭辞をXPath://d:applicationIdに使用します。私は、あなたが使用する技術に精通していないので、このアプローチがどのようにサポートされているかについてはわかりません。あなたが好きなら

//*[local-name()='applicationId' and namespace-uri()='http://domain.com/test'] 

または名前空間を無視:

は、以下の純粋なXPath 1.0の代替されているデフォルトではない理由を他の名前空間のための好奇心、のうち

//*[local-name()='applicationId'] 
+0

、私はDを行うことができます:applicationIdですが、ネームスペースが指定されていないときにパーサーが十分にスマートではありません。 – Stephane

+1

説明[ここ](http://stackoverflow.com/a/21149866/2998271)を参照してください。このスレッドは、あなたが説明したのと同じように動作するsimplexmlに関するものです。デフォルト以外の名前空間の場合にのみ名前空間を意味します。 – har07

+0

洞察力ありがとう。ベストは、明示的に名前空間の手紙を追加するために私のxmlを提供する人々をお勧めすることです。それは私のxpathクエリを大幅に単純化します – Stephane

関連する問題