如何使用xpath谓词排除除满足条件的节点之外的所有节点?

时间:2011-02-04 05:19:32

标签: .net xml xpath predicate

我需要帮助使用xpath从xml节点列表中排除特定节点。 xml结构如下。 xml文件很大,大约有8000个项目,其中大部分是子菜单类型。

<Menu>
  <MenuId>2905</MenuId> 
  <Item>
     <ItemId>191916</ItemId>
     <ItemType>content</ItemType> 
  </Item>
  <Item>
     <ItemId>17343</ItemId>
     <ItemType>submenu</ItemType>
     <Menu>
         ...
     </Menu>
  </Item>
</Menu>

我需要做的是对某个MenuID(例如2905)排除除ItemType ='content'

之外的所有子节点

我认为下面会有效吗?

Menu[MenuId !='2905' or MenuId = '2905' and child::ItemType = 'content']/Item

不应该选择2905中不存在的所有节点以及2905中的任何节点和内容类型吗?我尝试过的.NET用法如下:

        XmlNodeList nextLevelNodeList = currentNode.SelectNodes(string.Format("Menu[MenuId !='2905' or MenuId = '2905' and child::ItemType = 'content']/Item));

非常感谢任何想法...

欢呼声 森

3 个答案:

答案 0 :(得分:2)

在XPath表达式列表中添加一个,没有节点集union:

//Menu/Item[../MenuId != 2905 or ItemType = 'content']

含义:来自任何Menu元素的Item孩子的兄弟MenuId不等于2905ItemType子等于'content'

答案 1 :(得分:1)

以前的答案都不正确

使用(来自Menu元素的父级):

 Menu[not(MenuId = 2905)]/Item
|
 Menu[MenuId = 2905]/Item[ItemType='content']

答案 2 :(得分:0)

合并两个节点列表:

Menu[MenuId != '2905']/Item

Menu[MenuId = '2905']/Item[ItemType = 'content']