我需要帮助使用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));
非常感谢任何想法...
欢呼声 森
答案 0 :(得分:2)
在XPath表达式列表中添加一个,没有节点集union:
//Menu/Item[../MenuId != 2905 or ItemType = 'content']
含义:来自任何Menu
元素的,Item
孩子的兄弟MenuId
不等于2905
或ItemType
子等于'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']