2014-03-30 44 views
1

我試圖通過代碼(LINQ to XML)生成XML,它遵循與命名空間前綴相關的特定模式。我想生成如下的輸出由2個XML名稱空間的(示出的情況的例子;訂單屬性的無關):XElement中的重複命名空間(C#)

<name1 xmlns:space2="urn:schemas-upnp-org:namespace2/" xmlns="urn:schemas-upnp-org:namespace1/" name2="foo" space2:name4="demo"> 
    <name3>bar</name3> 
</name1> 

至關重要的是,namespace1是默認名稱空間(沒有前綴)和namespace2有一個前綴「space2」(我知道,但不要怪我 - 有標準要求這樣的東西)。

我在C#中嘗試了許多不同的方法。最有可能的,我會假設如下:

public static readonly XNamespace NS1 = "urn:schemas-upnp-org:namespace1/"; 
public static readonly XNamespace NS2 = "urn:schemas-upnp-org:namespace2/"; 

public static readonly XName Name1 = NS1 + "name1"; 
public static readonly XName Name2 = NS1 + "name2"; 
public static readonly XName Name3 = NS1 + "name3"; 
public static readonly XName Name4 = NS2 + "name4"; // in namespace 2 

void Test() { 
    var y = new XElement(Name1, 
      new XAttribute(XNamespace.Xmlns + "space2", NS2.NamespaceName), 
      new XAttribute(Name2, "foo"), 
      new XAttribute(Name4, "demo"), 
      new XElement(Name3, "bar")); 
    Trace.WriteLine(y.ToString()); 
} 

由於某些原因,但這是錯誤的。 namespace1中的一些元素被分配了一個奇怪的前綴「p1」。即使他們使用相同的命名空間引用,似乎LINQ認爲的命名空間名稱1名稱2是不同的,並且聲明它兩次:

<name1 xmlns:space2="urn:schemas-upnp-org:namespace2/" p1:name2="foo" space2:name4="demo" xmlns:p1="urn:schemas-upnp-org:namespace1/" xmlns="urn:schemas-upnp-org:namespace1/"> 
    <p1:name3>bar</p1:name3> 
</name1> 

的問題似乎並沒有出現,如果我給你一個前綴到命名空間1或者如果我從命名空間2刪除屬性,但這並沒有幫助,因爲這不會幫助解決問題。

所以問題的本質是:爲什麼LINQ在XML中爲NS1分配兩個不同的名稱空間聲明?它如何被配置爲始終映射到默認命名空間?

回答

0

您正在爲屬性「foo」指定名稱空間,該名稱空間爲默認名稱空間創建第二個映射。結果有2個有效的映射,並且它們中的任何一個(可能是最新的)都可以被選取用於節點。

請注意,屬性位於空名稱空間中,除非它們具有明確的前綴 - 所以您的代碼實際上會生成不同的XML:屬性名稱爲{urn:schemas-upnp-org:namespace2/}foo而不是{}foo

修復:沒有爲 「foo」 的

public static readonly XName Name2 = "name2"; 
+0

指定命名空間我不知道這件事。事實上,許多XML模式設計者似乎都認爲它們的屬性都是非限定的,這意味着從_attributes_中刪除名稱空間可以解決問題。謝謝! – micTronic