2017-02-26 88 views
0

我想写一个xpath来查找具有特定模式的后代的xml节点。举例来说,如果我有以下XML:是否有XPath查找特定模式下的节点?

<While> 
    <Condition> 
    <ID val="shouldLoop"/> 
    </Condition> 
    <Assign> 
    <ID val="StringVariable1"/> 
    <Parens> 
     <Parens> 
     <String val="StringLiteral"/> 
     </Parens> 
    </Parens> 
    </Assign> 
    <Assign> 
    <ID val="StringVariable2"/> 
    <String val="StringFigurative"/> 
    </Assign> 
    <Assign> 
    <ID val="StringVariable3"/> 
    <Add> 
     <String val="StringLiteral"/> 
     <String val="StringFigurative"/> 
    </Add> 
    </Assign> 
</While> 

我想获得前两三个“分配”的节点,基于它们具有的嵌套在0或“字符串”节点的子节点更多“Parens”标签。

是否有一个xpath可以完成类似于“(Parens /)* String”类似于“String”和“Parens/Parens/String”的正则表达式?

+0

'//分配[字符串|的括号//字符串]'会发现'Assign'以'String'儿童或有'Parens'孩子与任何'字符串'后裔。 ' ...'也会匹配,所以它不准确。 – tdelaney

回答

0

尝试以下XPath,让我知道结果

//Assign[//Parens[String] or String][position()<3] 
+0

此xpath似乎与所有带String或Parens/String节点的Assigns匹配,作为后代并返回前两个。如果示例XML中的Assign节点的排列顺序不同,我希望它仍然可以使用StringVariable1和StringVariable2返回赋值,但不会返回StringVariable3。 我正在寻找一个xpath,它将返回没有任何分配或只有他们和他们的字符串后代节点之间的Parens。 StringVariable3的Add节点打破了该模式,所以它应该被排除,但其余的应该匹配。 – user2917486

+0

可能有类似于''?你也不想匹配这个,对吧? – Andersson

+0

没错。 不匹配。 – user2917486