2016-11-09 53 views
2

我有一個XML文檔,如下所示:獲取使用XPATH的XML節點的名稱上蜂巢

<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note> 

在蜂房,我能夠使用xpath使用檢索XML文檔中的每個節點的文本以下命令:

select xpath(xml_text,'//*[name()='note']//text()') from table_test;

不過,我想不出使用的蜂巢其XPATH命令來檢索文本 的XML節點名稱對於上面的例子中,我希望能夠回到 ["to","from","heading","body"],它們表示XML文件中的令牌的XML節點。 任何幫助表示讚賞。

回答

2

通常,您只能使用xpath來獲取文本或元素屬性 - 不是節點的名稱。

因此,有兩種選擇:您可以編寫(或聯機查找)定製UDF,該UDF返回給定xpath的節點名稱。

或者,你可以使用這個技巧:

select xpath(regexp_replace(xml_text,'<([\\w]+),'<$1 nodename=\'$1\' '),note/*/@nodename) 

說明:它增加了nodename屬性的任何XML元素。 (<to> -> <to nodename='to'>)它也可能在一些文本中添加它,但由於您只提取nodename屬性 - 它應該沒有關係。

順便說一句,你可以重寫你的文本查詢:

select xpath(xml_text,'note/*/text()') from table_test;

+0

感謝亞歷克斯,自定義UDF任何建議? –

+1

@DonGorgon你可以將[原始配置單元xpath UDF](https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/xml/ GenericUDFXPath.java)並將第83行從'getNodeValue()'更改爲'getNodeName()'。也許添加一些測試,以確保節點是一個元素 –

+0

感謝您的建議。這肯定會起作用。 –