2012-02-12 90 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