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

标签 .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));

任何想法将不胜感激......

干杯 弥敦道

最佳答案

将一个添加到 XPath 表达式列表,没有节点集并集:

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

含义:从任何 Menu 元素,Item 子元素的同级 MenuId 不等于 2905 或等于 'content'

ItemType 子级

关于.net - 如何使用 xpath 谓词排除满足条件的节点以外的所有节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894824/

相关文章:

c# - 使用泛型类型参数时有歧义的方法重载

c# - 让 XamlReader.Load 忽略未知的 xml 而不是崩溃?

xml - XSLT:在两个xsl:for-each循环中提取已知前辈的最新DateTime

PHP XML 内存泄漏?

c# - visual studio 安装程序安装项目将不正确的 .net 框架版本检测为依赖项

c# - .Include() 与 .Load() 在 EntityFramework 中的表现

XPath 1查询和属性名称

python - 使用 python 和 lxml 从大型 HTML 文件中解析和提取信息

.net - .NET 是否支持 Windows Eventing 6.0?

XML 发票规范