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

发布于 2024-10-15 12:47:58 字数 941 浏览 2 评论 0原文

我需要帮助使用 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));

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

干杯 内森

I need help using xpath to exclude particular nodes from an xml node list. The xml structure is below. The xml file is large, around 8000 items, the majority of which are submenu type.

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

What I need to do is for a certain MenuID (2905, for example) exclude all child nodes except those where ItemType = 'content'

I thought the below would work?

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

Shouldn't that select all nodes that are not in 2905 and any that are in 2905 and of the content type? The .NET usage I've tried is below:

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

Any ideas would be greatly appreciated...

cheers
Nathan

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

留一抹残留的笑 2024-10-22 12:47:58

将一个添加到 XPath 表达式列表中,无需节点集联合:

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

含义:来自任何 Menu 元素,Item 子元素具有同级 MenuId 不等于 2905ItemType 子项等于 'content'

Adding one to the list of XPath expressions, without node set union:

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

Meaning: from any Menu element, the Item child having a sibling MenuId not equal to 2905 or a ItemType child equal to 'content'

不交电费瞎发啥光 2024-10-22 12:47:58

之前的两个答案都不正确

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

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

Both previous answers are incorrect.

Use (from the parent of the Menu elements):

 Menu[not(MenuId = 2905)]/Item
|
 Menu[MenuId = 2905]/Item[ItemType='content']
不打扰别人 2024-10-22 12:47:58

合并两个节点列表:

Menu[MenuId != '2905']/Item

并且

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

Combine two node lists:

Menu[MenuId != '2905']/Item

And

Menu[MenuId = '2905']/Item[ItemType = 'content']
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文