Xml PerlXPath:use";及;返回两个节点 汪汪 哞 啁啾声
我使用的是Xml PerlXPath:use";及;返回两个节点 汪汪 哞 啁啾声,xml,perl,xpath,Xml,Perl,Xpath,我使用的是XML::LibXML,版本1.0,我只想在两个XPath表达式(条件)都满足时返回节点 如果我使用垂直或条形|,此XPath表达式将起作用: //dog[.=“woof”]|//bird[.=“chirp”]如果有几只狗和一只鸟(或反之亦然),应该返回什么还不清楚 您可以首先检查是否至少有两个节点满足条件,然后选择它们: <pets> <dog>woof</dog> <cow>moo</cow> <bird
XML::LibXML
,版本1.0,我只想在两个XPath表达式(条件)都满足时返回节点
如果我使用垂直或
条形|
,此XPath表达式将起作用:
//dog[.=“woof”]|//bird[.=“chirp”]
如果有几只狗和一只鸟(或反之亦然),应该返回什么还不清楚
您可以首先检查是否至少有两个节点满足条件,然后选择它们:
<pets>
<dog>woof</dog>
<cow>moo</cow>
<bird>chirp</bird>
</pets>
(在其中测试,它非常适合使用XPath表达式)不清楚如果有几只狗和一只鸟(反之亦然),应该返回什么 您可以首先检查是否至少有两个节点满足条件,然后选择它们:
<pets>
<dog>woof</dog>
<cow>moo</cow>
<bird>chirp</bird>
</pets>
(在其中进行了测试,该测试非常适合使用XPath表达式)/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]
或
//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]
选项1-俯视法 让我们首先假设您想要返回
pets
元素。为此,我们可以使用以下方法:
/*[dog=“woof”和bird=“chirp”]
[…]
可以看作WHERE子句。上面返回pets
元素,其中dog=“woof”和bird=“chirp”
为真
以下内容也适用(其中dog=“woof”
为真,而bird=“chirp”
为真):
/*[dog=“woof”][bird=“chirp”]
我们可以自定义它,通过添加它来返回其他东西
/*[dog=“woof”和bird=“chirp”]/(dog[.=“woof”]| bird[.=“chirp”])
如您所见,|
是联合运算符,它将两组节点组合在一起
一个问题。XML::LibXML不支持这种语法,因为libxml2只支持XPath1.0。可以进行小的调整以进行补偿
/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]
选项2-查找/绕行方法 另一种表述先前搜索的方式是:将另一个作为兄弟的狗和鸟
//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]
[根据@kjhughes答案,尽可能简化为
dog[.=“woof”]
到dog=“woof”
。/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]
或
//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]
选项1-俯视法 让我们首先假设您想要返回
pets
元素。为此,我们可以使用以下方法:
/*[dog=“woof”和bird=“chirp”]
[…]
可以看作WHERE子句。上面返回pets
元素,其中dog=“woof”和bird=“chirp”
为真
以下内容也适用(其中dog=“woof”
为真,而bird=“chirp”
为真):
/*[dog=“woof”][bird=“chirp”]
我们可以自定义它,通过添加它来返回其他东西
/*[dog=“woof”和bird=“chirp”]/(dog[.=“woof”]| bird[.=“chirp”])
如您所见,|
是联合运算符,它将两组节点组合在一起
一个问题。XML::LibXML不支持这种语法,因为libxml2只支持XPath1.0。可以进行小的调整以进行补偿
/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]
选项2-查找/绕行方法 另一种表述先前搜索的方式是:将另一个作为兄弟的狗和鸟
//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]
[根据@kjhughes的回答,尽可能将简化的
dog[.=“woof”]
转换为dog=“woof”
。]
将分别选择字符串值为“woof”
和“chirp”
且存在于公共父元素中的所有dog
和bird
元素:
//*[dog="woof" and bird="chirp"]/*[self::dog="woof" or self::bird="chirp"]
woof
啁啾声
功劳:@ikegami在解释OP意图方面的帮助是不可或缺的。一定要记住他的答案
旁注:
|
是一个联合运算符(在XPath 1.0和XPath 2.0中都是)。这是不符合逻辑或不合理的
这个 将分别选择字符串值为
“woof”
和“chirp”
且存在于公共父元素中的所有dog
和bird
元素:
//*[dog="woof" and bird="chirp"]/*[self::dog="woof" or self::bird="chirp"]
woof
啁啾声
功劳:@ikegami在解释OP意图方面的帮助是不可或缺的。一定要记住他的答案
旁注:
|
是一个联合运算符(在XPath 1.0和XPath 2.0中都是)。这是不符合逻辑或不合理的
谢谢各位。。。抱歉,我只想返回匹配的节点,等于和,即使有多个匹配。。。但是我不想要父节点;我也不想在xpath表达式中指定/使用绝对“pets”路径来避免返回父节点。我喜欢这个Choroba://*[狗[.=“呜呜”][鸟[.=“唧唧”]]/*[名字()=“狗”和.=“呜呜”或名字()=“鸟”和.=“唧唧”]在第二个选项上有轻微的变化://*[狗[.=“唧唧”]/*[狗[.=“呜呜”]或//鸟[.=“唧唧”]@pp,不,那(包括牛)。你要去的地方。我的答案更简单。请注意,使用
名称(不检查名称空间)可能会导致问题(破坏X的扩展性)