当父节点有名称空间时,在pig中使用xpathall

juzqafwq  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(331)

我正试图通过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;

脚本运行时没有错误,但返回空结果:()。我是否必须因为名称空间的不同而调用xmloader?

eit6fx6z

eit6fx6z1#

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

ns:Parent/ns:Child

我不使用pig,所以不知道它是否支持前缀声明。纯xpath方法将通过本地名称和命名空间uri的组合来匹配元素(为可读性而 Package ):


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

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

如果其他名称空间中没有其他同名元素,则可以通过剥离 namespace-uri 标准:


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

相关问题