Hive XPath如何提取XML中指定类型元素的数组?
如何用XPath提取XML中指定元素的文本数组?
嘿,我来帮你解决这个XPath的问题!首先看你给出的XML结构:
<d><a><c>1</c><b>2</b><b>3</b></a></d>
你想要提取<b>元素的文本数组[2,3],但之前的尝试遇到了两个问题:
- 用
//*[local-name()='a']/*/text()得到了[1,2,3],这是因为*匹配了<a>下的所有子元素(包括<c>和<b>),所以把所有文本都包含进来了 - 用
//*[local-name()='a']/b返回空数组,这大概率是命名空间在搞鬼
正确的XPath写法
如果你的XML带有默认命名空间(比如根元素隐含了xmlns属性),或者你必须用local-name()来规避命名空间问题,那么正确的表达式应该是:
//*[local-name()='a']/*[local-name()='b']/text()
如果你的XML没有任何命名空间(就是你给出的纯结构),那可以更简洁:
//a/b/text()
为什么之前的//*[local-name()='a']/b失效?
如果XML里存在默认命名空间(比如<d xmlns="http://some-namespace.com">),但你在XPath里没有绑定对应的前缀,直接写b会被解析成无命名空间的元素,而XML中的<b>其实属于默认命名空间,所以匹配不到。用*[local-name()='b']就能只匹配本地名称为b的元素,完美避开命名空间的干扰。
用上面的正确表达式测试,就能得到你想要的[2,3]数组啦!
内容的提问来源于stack exchange,提问作者gjin
相关产品推荐
相关产品推荐

