我正在尝试通过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?
答案 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']