Hive XPath UDF 与命名空间一起不起作用
Hive XPath UDF alongside namespaces doesn't work
我正在尝试使用 UDF 来解析我的 xml 文档。如果我 运行 以下内容,它会起作用:
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?
谢谢!
第二个XML引入默认命名空间,它不仅影响声明默认命名空间的元素,而且影响所有没有前缀的后代元素,包括applicationId
元素:
xmlns="http://domain.com/test"
通常,您需要将前缀(例如 d
)映射到默认名称空间 uri,并在 XPath 中使用该前缀://d:applicationId
。我不熟悉您使用的技术,因此不确定这种方法如何以及是否受支持。
以下是纯 XPath 1.0 替代方案:
//*[local-name()='applicationId' and namespace-uri()='http://domain.com/test']
或者如果你愿意,可以忽略命名空间:
//*[local-name()='applicationId']
我正在尝试使用 UDF 来解析我的 xml 文档。如果我 运行 以下内容,它会起作用:
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?
谢谢!
第二个XML引入默认命名空间,它不仅影响声明默认命名空间的元素,而且影响所有没有前缀的后代元素,包括applicationId
元素:
xmlns="http://domain.com/test"
通常,您需要将前缀(例如 d
)映射到默认名称空间 uri,并在 XPath 中使用该前缀://d:applicationId
。我不熟悉您使用的技术,因此不确定这种方法如何以及是否受支持。
以下是纯 XPath 1.0 替代方案:
//*[local-name()='applicationId' and namespace-uri()='http://domain.com/test']
或者如果你愿意,可以忽略命名空间:
//*[local-name()='applicationId']