父节点具有命名空间时在Pig中使用XPathAll

时间:2016-12-16 17:16:09

标签: xml xpath apache-pig

我正在尝试通过Azure上的Pig脚本运行XML文件。我遇到了一些问题,我认为可能是因为我的父节点有一个命名空间。

REGISTER 'piggybank-0.15.0.jar';
DEFINE XPathAll org.apache.pig.piggybank.evaluation.xml.XPathAll();
A = LOAD 'file.xml' using org.apache.pig.piggybank.storage.XMLLoader('Parent') as (x:chararray);
B = FOREACH A GENERATE XPathAll(x, 'Parent/Child', true, true);
DUMP B;

脚本运行时没有错误,但返回一个空结果:()。由于命名空间,我是否必须以不同方式调用XMLLoader?

1 个答案:

答案 0 :(得分:0)

通常,您需要声明一个前缀,比如ns,引用默认的命名空间URI,然后使用该前缀来引用默认命名空间中的元素:

ns:Parent/ns:Child

我不使用Pig,所以不知道它是否支持前缀声明。纯XPath方法将通过 local-name namespace-uri 的组合来匹配元素(为了便于阅读而包装):

*[local-name()='Parent' and namespace-uri()='default ns URI here']
/*[local-name()='Child' and namespace-uri()='default ns URI here']

如果在其他命名空间中没有其他具有相同名称的元素,则可以通过剥离namespace-uri条件来简化XPath:

*[local-name()='Parent']/*[local-name()='Child']