2012-02-12 62 views
1

假设我我的XML文档中有这些元素的命名空间:Identyfing内部XML元素

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

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

我问,因为我解析了C#中的代码,并且它一直向CustomXML元素添加“xmlns =”“”,这让我认为否则它会将这些元素视为架构元素。

+0

对不起 - 我错了 - svick是对的。用特定前缀定义的XML名称空间不会继承到其子级(除非它们还指定了XML名称空间前缀)。 **默认** XML名称空间(定义为'xmlns =“......”''没有任何前缀)另一方面**是从子节点链向下继承的。 – 2012-02-12 15:19:04

+0

因此,在你的情况下,''和''是**默认** XML名称空间的一部分(不管可能如何),而''节点明显在定义的'xs =“中。 ..“'XML命名空间 – 2012-02-12 15:20:02

回答

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")); 
+0

你的回答很有用 - 我头脑中有一个错误的想法,那就是从父级继承到子节点的XML名称空间(用前缀定义)该机制仅适用于默认的XML名称空间(不带任何前缀)。感谢您解决这个问题! – 2012-02-12 16:58:05

+0

谢谢你,我解决了这个问题,它现在完美的工作! – STT 2012-02-13 18:22:09