【问题标题】:Hive XPath UDF alongside namespaces doesn't workHive XPath UDF 与命名空间一起不起作用
【发布时间】:2016-08-26 20:01:37
【问题描述】:

我正在尝试使用 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 hadoop xpath hive xml-namespaces


    【解决方案1】:

    第二个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']
    

    【讨论】:

    • 出于好奇,为什么对于其他命名空间不是默认的,我可以做 d:applicationId,但是当没有指定命名空间时解析器不够聪明,只暗示默认的?
    • 见解释here。该线程是关于 simplexml 的,其行为与您解释的相同:它暗示命名空间仅适用于非默认命名空间
    • 有见地的感谢。最好是推荐提供我的 xml 的人明确地为命名空间添加一个字母。这将大大简化我的 xpath 查询
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多