PySpark XPath提取XML指定属性子节点值失败求助
问题解决方法
你的XPath提取失败主要有4个问题,对应修正后的代码如下:
错误原因
- 未处理XML命名空间:所有节点带
ns1:前缀,XPath必须匹配或忽略该前缀 - 属性值未加引号:XPath中字符串类型的属性值必须用引号包裹
- 目标ID写错:你要提取
id=9616的节点,但代码里写的是9611 - 根节点路径错误:XML根节点是
ns1:visitors,不是visitors
修正方案1:忽略命名空间(无需知道命名空间URI)
使用local-name()匹配节点名称,避开前缀影响:
df = df.selectExpr( "xpath_string(visitors, '/*[local-name()=\"visitors\"]/*[local-name()=\"visit\" and @name=\"loy\"]/*[local-name()=\"visitor\" and @id=\"9616\"]') as result" )
这里用xpath_string直接返回单个字符串结果,而不是数组。
修正方案2:指定命名空间映射(如果知道命名空间URI)
如果XML的ns1有对应的URI(比如XML头部声明了xmlns:ns1="http://xxx.com"),可以直接在XPath中使用前缀,并通过第三个参数传入命名空间映射:
df = df.selectExpr( "xpath_string(visitors, '/ns1:visitors/ns1:visit[@name=\"loy\"]/ns1:visitor[@id=\"9616\"]', map('ns1', 'http://your-namespace-uri')) as result" )
两种方案运行后,都会返回目标值Dr George。
内容的提问来源于stack exchange,提问作者loy
相关产品推荐
相关产品推荐

