【问题标题】:Identyfing the namespace of an inner XML element识别内部 XML 元素的名称空间
【发布时间】:2012-02-12 22:55:39
【问题描述】:

假设我的 XML 文档中有这样的元素:

<xs:appinfo>
  <CustomXML>
    <Something>something</Something>
  </CustomXML>
</xs:appinfo>

“xs”被声明为默认模式命名空间。我的问题是:解析器如何解释 xs:appinfo 的内部元素?它们属于哪个命名空间?

我问是因为我正在用 C# 解析代码,并且它不断向 CustomXML 元素添加“xmlns=""”,这让我假设否则它会将这些元素视为架构元素。

【问题讨论】:

  • 抱歉 - 我错了 - svick 是对的。使用特定前缀定义的 XML 名称空间不会继承给其子项(除非它们还指定了该 XML 名称空间前缀)。另一方面,default XML 命名空间(定义为 xmlns="......",不带任何前缀) 沿子节点链继承。
  • 因此,在您的情况下,&lt;CustomXML&gt;&lt;Something&gt;default XML 命名空间的一部分(无论可能是什么),而 &lt;appinfo&gt; 节点显然是在定义的xs="....." XML 命名空间中

标签: c# xml xsd


【解决方案1】:

根据§6.2 Namespace Defaulting of Namespaces in XML 1.0 (Third Edition)

默认命名空间声明的范围从它出现的开始标记的开头延伸到相应结束标记的结尾,不包括任何内部默认命名空间声明的范围。 […]

默认命名空间声明适用于其范围内的所有无前缀元素名称。

这意味着没有命名空间前缀的元素被解释为在默认命名空间中。默认命名空间通常定义在文档的第一个元素上,如下所示:

<element xmlns="namespace-uri">

库会在必要时重新定义默认命名空间,也就是说,当您将元素添加到没有命名空间的文档时。换句话说,这样的元素不在默认命名空间中,因此库通过将xmlns="" 添加到该元素来解决这个问题,这将这个元素及其所有后代的默认命名空间重新定义为“无命名空间”。

如果要添加默认命名空间中的元素,则必须明确指定它。例如,在 LINQ to XML 中:

XDocument doc = …;

var ns = doc.Root.GetDefaultNamespace();

var newElement = new XElement(ns + "foo"));

【讨论】:

  • 你的答案是正确的——我对从父节点到子节点继承的 XML 命名空间(用前缀定义)有一个错误的想法;该机制仅适用于默认 XML 命名空间(没有任何前缀)。感谢您清除它!
  • 谢谢你们,我已经解决了这个问题,现在可以完美运行了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2021-04-24
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2012-11-27
  • 2021-04-07
相关资源
最近更新 更多