如果使用text()找不到属性的值,则xpath返回默认值


sample_xml='<employees>
<person id="p1">
<name value="Alice">ALICE</name>
</person>
<person id="p2">
<name value="Alice">BOB</name>
</person>
<person id="p3">
<name value="Alice"/>
</person>
</employees>'
data = [
[f'{sample_xml}']  
]
df = spark.createDataFrame(data, ['data'])
df=df.selectExpr(
'xpath(data,"/employees/person/name[@value='Alice']/text()") test'   
)

这给出了表达式["ALICE"、"BOB"]

问题

我希望我的结果是["ALICE","BOB","NA"]

即对于空路径,如低于

<name value="Alice"/>

我想返回一个默认NA。

有可能做到这一点吗?

问候

对于XPath本身,这是不可能的。它只能返回匹配节点的实际值,如果不匹配则不返回
为了获得NA或XML中实际不包含的任何其他数据,您应该用一些额外的外部代码包装基本XPath请求,以便在不匹配的情况下返回自定义输出。

在XPath 2.0中,使用/employees/person/name[@value='Alice'] /(string(text()), 'NA')[1]"

这在XPath1.0中是做不到的。在XPath1.0中,没有字符串序列这样的东西;您只能返回一系列节点,并且只能返回输入文档中实际存在的节点。

最新更新