2016-11-09 51 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

感谢您的建议。这肯定会起作用。 –