2010-02-25 42 views
2

如果一個節點屬於一個名稱空間,那麼它默認情況下的子節點屬於同一名稱空間。所以不需要爲每個孩子提供xmlns屬性,這很好。LINQ to XML:抑制子節點中的冗餘名稱空間屬性

但是,

如果我創建這樣兩個節點:

Dim parent = <parent xmlns="http://my.namespace.org"/> 
Dim child = <child xmlns="http://my.namespace.org">value</child> 

parent.Add(child) 

Console.WriteLine(parent.ToString) 

結果是這樣的:

<parent xmlns="http://my.namespace.org"> 
    <child xmlns="http://my.namespace.org">value</child> 
</parent> 

但是,如果在一個不太方便的方式來創建它們:

Dim parent = <parent xmlns="http://my.namespace.org"/> 
Dim child As New XElement(XName.Get("child", "http://my.namespace.org")) With {.Value = "value"} 

parent.Add(child) 

Console.WriteLine(parent.ToString) 

的結果更可取:

<parent xmlns="http://my.namespace.org"> 
    <child>value</child> 
</parent> 

顯然,我更喜歡使用第一種方式,因爲它更加直觀,易於編碼。還有另一個原因,不使用方法2 - 有時我需要創建節點與XElement.Parse,解析包含xmlns屬性,產生完全相同的結果作爲方法1的字符串。

所以問題是 - 怎麼做我得到方法2的漂亮輸出,像方法1一樣創建節點?我看到的唯一選擇是創建一個方法來克隆給定的XElement,根據方法2的模式有效地重新創建它,但這看起來很醜。我正在尋找我出於某種原因忽略的更明顯的解決方案。

+0

@GSerg:下面的答案是否回答你的問題? – 2010-04-09 07:13:47

回答

1

呃...命名空間 - 他們將是我的死亡。

在這裏你去:

Dim ns As XNamespace = "http://my.namespace.org" 
Dim parent = <<%= ns + "parent" %>/> 
Dim child = <<%= ns + "child" %>>value</> 
parent.Add(child) 

爲了能夠使用XElement.Parse並保持子節點同步與其父節點的命名空間,所以最好使用全局命名空間。在VB.NET中真的很容易做到。在你的模塊/類的頂部,只需使用一個Imports,所有父母和孩子都將使用這個命名空間。例如:

Imports <xmlns="http://my.namespace.org"> 
Module Main 
    Sub SomeSub() 
     Dim child = <child>value</child> 
     Dim parent = <parent><%= child %></parent> 
     Console.WriteLine(parent.ToString) 
    End Sub 
End Module 

請注意,首先創建了<child/>元素。這同樣適用於非默認命名空間,如Imports <xmlns:p="http://parent.namespace.org">,然後使用<p:child/><p:parent/>創建。

我曾經閱讀過,但還沒有找到,混合XML文字與我不知道你在說什麼,但它是 - 這是一個壞主意。

+0

這是一個很棒的伎倆!文字有點雜亂,但輸出更清晰。 – CoderDennis 2010-03-11 17:38:10

+0

這個技巧確實很棒,但它只能部分解決問題。如果我得到了我解析的XML字符串,則輸出包含子節點的名稱空間。所以我正在尋找一種方法來設置某種我不想要的東西 - 這些標誌是針對已經構建的節點而不是構建節點的特殊方式 - 因爲我有時不能使用這種特殊方式。如果沒有其他解決方案,我很樂意接受這個答案。 – GSerg 2010-04-16 15:35:26

+0

@GSerg:啊,我現在得了。我已經更新了我希望能爲你工作的答案。 – 2010-04-16 19:32:57

相關問題