【问题标题】:C# - XPath to find Subnodes that are null, OR have a specific Attribute valueC# - XPath 查找为空或具有特定属性值的子节点
【发布时间】:2022-01-23 00:03:13
【问题描述】:

我有以下 XML:

<process>
  <stage stageid="f163a7e1-1343-4864-9f3f-b1d885445d15" name="Start" type="Start">
    <subsheetid>1c12d9f9-9d2c-43d0-b267-ae6eb1d4b589</subsheetid>
  </stage>
  
  <stage stageid="8ca8728e-c30b-4748-87a8-4c7214066d8c" name="End" type="End">
    <subsheetid>1c12d9f9-9d2c-43d0-b267-ae6eb1d4b589</subsheetid>
  </stage>
  
  <stage stageid="9a7a7a97-30d9-455c-aa7c-daf954e8f9f8" name="Kill Chrome" type="Action">
    <subsheetid>1c12d9f9-9d2c-43d0-b267-ae6eb1d4b589</subsheetid>
    <loginhibit onsuccess="false" />
  </stage>
 
 <stage stageid="0b76701a-3c47-46c2-af22-8be4d10c9611" name="Kill Outlook" type="Action">
    <subsheetid>1c12d9f9-9d2c-43d0-b267-ae6eb1d4b589</subsheetid>
    <loginhibit onsuccess="true" />
  </stage>

  <stage stageid="7419f58d-a8f4-47af-8feb-b25a10d7824e" name="File Exists?" type="Action">
    <subsheetid>add10b41-dbad-4295-8a98-a5553064e9a1</subsheetid>
  </stage>
</process>

我想获取 stage/loginhibit.onsuccess 为“false”或 null 的 Action 节点列表。此语句中的 XPath:

XmlPathNodeList stages = _xmldoc.SelectNodes("process/stage[@type='Action'][loginhibit[@onsuccess='false']or(not(loginhibit))]");

将在 xpather.com 上给我正确的结果,但在 .NET 6 中使用 VSCode 时不会,它返回一个空列表。

提前致谢!

【问题讨论】:

  • XML 中不存在“null”之类的东西。

标签: c# xml xpath xmldocument .net-6.0


【解决方案1】:

你可以更简单地做到这一点

/process/stage[@type='Action'][not(loginhibit/@onsuccess='true')]

【讨论】:

  • 这在 XPather.com 中确实有效,但是当与 System.Xml.XmlNode.Selectnodes() 一起使用时,会返回零节点,
  • 它也适用于extendsclass.com/xpath-tester.html 的 XPath 测试器。它开始看起来像一个 .NET 6.0 框架问题。
  • 当我在 .NET Framework 4.7.2 中重新构建我的代码时,它产生了预期的结果,因此在 .NET 6 中似乎存在 XPath 问题。
【解决方案2】:

缺少前导正斜杠:

/process/stage[@type='Action']
[loginhibit[@onsuccess='false']or(not(loginhibit))]

总的来说,最好使用 LINQ to XML API。它自 2007 年起在 .NET Framework 中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2020-06-11
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多