标识内部XML元素的名称空间

时间:2012-02-12 10:46:24

标签: c# xml xsd

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

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

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

我问,因为我正在解析C#中的代码,并且它不断向CustomXML元素添加“xmlns =”“”,这使我假设它将这些元素视为模式元素。

1 个答案:

答案 0 :(得分:1)

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

  

默认命名空间声明的范围从它出现的start-tag的开头延伸到相应的end-tag的末尾,不包括任何内部默认命名空间声明的范围。 [...]

     

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

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

<element xmlns="namespace-uri">

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

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

XDocument doc = …;

var ns = doc.Root.GetDefaultNamespace();

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