C# XPath:选择不在A节点内的所有A节点和所有B节点

C# XPath:选择不在A节点内的所有A节点和所有B节点,c#,vb.net,xpath,C#,Vb.net,Xpath,在一个XPath表达式中是否可以执行以下操作(请参见下面的示例): 选择所有(msg类的span标记)和所有((具有非空alt属性的img标记)和(不位于msg类的span标记内)) 简化样本: <span class="msg">Message text A</span> <img alt="" /> <span class="msg">Message text B <img alt="text A" /></span>

在一个XPath表达式中是否可以执行以下操作(请参见下面的示例):

选择所有(msg类的span标记)和所有((具有非空alt属性的img标记)(不位于msg类的span标记内))

简化样本:

<span class="msg">Message text A</span>
<img alt="" />
<span class="msg">Message text B <img alt="text A" /></span>
<span class="err">Error text C <img alt="text B" /></span>
<img alt="text C" />
<span class="err">Error text D</span>
消息文本A
消息文本B
错误文本C
错误文本D
生成的节点集应包含:

<span class="msg">Message text A</span>
<span class="msg">Message text B <img alt="text A" /></span>
<img alt="text B" />    
<img alt="text C" />
消息文本A
消息文本B

未测试,但类似于

//span[@class='msg'] | //img[@alt!='' and not(ancestor::span[@class='msg'])]

没有测试过,但类似于

//span[@class='msg'] | //img[@alt!='' and not(ancestor::span[@class='msg'])]

谢谢,这个很好用!我删除了第一个“not(祖先::…”,因为材料不能在msg span中包含msg span。它通过相同的数据保存了两次迭代,从而加快了速度。好吧-我计算错了一些括号;-pThanks,这很好!我删除了第一个“not(祖先:…”)因为材料不能在msg spans中包含msg span。它通过相同的数据节省了两次迭代,从而加快了速度。好的-我算错了一些括号;-p