如何用XPath获取饮用wine或beer宾客的name属性值?
解决XPath筛选饮用wine/beer的guest姓名属性问题
先看你提供的XML示例:
<?xml version="1.0" encoding="UTF-8"?> <party date="31.12.01"> <guest name="Albert"> <drink>wine</drink> <drink>beer</drink> <status single="true" sober="false" /> </guest> <guest name="Martina"> <drink>apple juice</drink> <status single="true" sober="true" /> </guest> <guest name="Zacharias"> <drink>wine</drink> <status single="false" sober="false" /> </guest> </party>
你之前写的表达式问题出在路径方向搞反了://guest/@name/drink这种写法是在找guest节点的name属性的子节点drink,但属性本身不是节点,根本没有子节点,所以自然得不到结果。
正确的XPath表达式
要筛选出饮用wine或beer的guest的name属性值,应该先定位到符合条件的guest节点,再提取它的name属性:
- 获取所有符合条件的name属性节点(适合批量结果):
//guest[drink[.="wine" or .="beer"]]/@name
- 如果只需要第一个匹配的属性值(转为字符串):
string(//guest[drink[.="wine" or .="beer"]]/@name)
简化写法
XPath里可以直接简化条件判断,不用嵌套drink[.],写成:
//guest[drink="wine" or drink="beer"]/@name
逻辑说明
这个表达式的核心是:
- 先找到所有
guest节点,要求该节点下存在值为wine或beer的drink子节点 - 然后提取这些
guest节点的name属性
用你的XML测试的话,会返回Albert和Zacharias的name属性值,完全符合预期。
内容的提问来源于stack exchange,提问作者AlbertoGiorgino
相关产品推荐
相关产品推荐

