c# - XML SelectNode() 不返回任何内容。为什么命名空间很重要?

标签 c# xml

我有获取根元素节点的代码:

xmlNodes = rootElement.SelectNodes("DefinitionName");

它不返回存在的节点。在调试器中,我可以展开 rootElement 以找到 DefinitionName。显然,问题在于文件定义了命名空间(请参阅下面的 XML)。 MSDN说我必须做这样的事情才能让节点返回:

注意:这与我的代码无关。这是来自 MSDN 的示例:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com");
XmlNodeList nodelist = doc.SelectNodes("//ab:book", nsmgr);

我有两个问题:

  1. 为什么命名空间很重要?如果我想要一个节点,并且它存在,就给我吧。
  2. 我的应用程序处理许多 XML 文件。我应该如何指定命名空间 (nsmgr.AddNamespace())?我是否需要先解析文件才能获取该文件?

我情不自禁地觉得我正在采取漫长、充满焦虑的方式来做这件事。

这是 XML:

    <?xml version="1.0" encoding="utf-8"?>
    <SessionStateInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    z:Id="1" z:Type="Company.Apps.MoreHere.Session.SessionStateInfo"
    z:Assembly="assembly info here"
    xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
    xmlns="http://schemas.datacontract.org/2004/07/MoreHere.Session">
      <CoaterNumber>25</CoaterNumber>
      <DefinitionName z:Id="2">Two Line</DefinitionName>
      <EnableManualMode>true</EnableManualMode>

最佳答案

<SessionStateInfo ....
    xmlns="http://schemas.datacontract.org/2004/07/MoreHere.Session">

表示此元素及其所有后代都在 http://schemas.datacontract.org/2004/07/MoreHere.Session 命名空间中。由于 XPath 中没有前缀的名称总是引用 no 命名空间中的元素,因此您需要将此 URI 绑定(bind)到一个前缀并在您的 XPath 中使用该前缀,即使文档中没有使用前缀。

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("mhs", "http://schemas.datacontract.org/2004/07/MoreHere.Session");
xmlNodes = rootElement.SelectNodes("mhs:DefinitionName", nsmgr);

如果您知道要查找的元素始终具有相同的本地名称,但可能有也可能没有命名空间(或者可能有不同的命名空间),那么您可以使用 XPath 技巧,例如

rootElement.SelectNodes("*[local-name() = 'DefinitionName']");

关于c# - XML SelectNode() 不返回任何内容。为什么命名空间很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15685960/

相关文章:

c# - 签名和创建 asn1 签名消息 - BouncycaSTLe

c# - 使用 Razor HTML 帮助程序编码时是否可以使用 CSS

php - 通过 DOMDocument 获取具有子节点的节点的内容

xml - 在 Hadoop 中创建许多小的 XML 文件

c# - 任何人都可以将这 3 个 LINQ to SQL 语句缩减为一个吗?

c# - 以编程方式在 SQL Server 上查找和应用架构差异

C# WPF ComboBox - 允许每个列表只选择一次项目

java - 从资源中读取 XML 文件

ruby-on-rails - Daemon vs Runner vs Rake Tasks vs Active Job

java - 如何用DOM解析大型xml文档?