2011-05-12 139 views
7

我有這樣一個XML文件:的XElement添加前綴只

<myPrefix:Catalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:myPrefix="clr-namespace:........"> 

    <myPrefix:Item Name="Item1" Mode="All" /> 
    <myPrefix:Item Name="Item2" Mode="Single" /> 

</myPrefix:Catalog> 

用C#創建像一個新的項目:

XContainer container = XElement.Parse(xml); 
XElement xmlTree = 
    new XElement("Item", 
     new XAttribute("Name", item.Name), 
     new XAttribute("Mode", item.Mode)); 

正如你可以看到,我不添加「myPrefix」字首。誰能告訴我我該怎麼做?我不想再次分解xmlns。謝謝你,彼得

回答

3

編輯1:
如果添加了命名空間藏漢屬性的元素,這將迫使它添加前綴。但是您仍然以節點中的xmlns屬性結束。 要刪除它,你可能會像Jeff說的那樣,需要使用XmlWriter。

編輯2:
爲了得到你想要的,你需要創建藏漢根元素的確切XML:

編輯3:
確定。我找到一種方式來獲得你想要的東西沒有的XmlWriter:

var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>"; 

XNamespace presentation = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
XNamespace xaml = "http://schemas.microsoft.com/winfx/2006/xaml"; 
XNamespace mscorlib = "clr-namespace:System;assembly=mscorlib"; 
XNamespace myPrefix = "clr-namespace:......."; 

XElement container = XElement.Parse(xml); 

var xmlTree = new XElement("Item", 
       new XAttribute("Name", "Item2"), 
       new XAttribute("Mode", "Single")); 

container.Add(xmlTree); 

foreach (var el in container.DescendantsAndSelf()) 
{ 
    el.Name = myPrefix.GetName(el.Name.LocalName); 
    var atList = el.Attributes().ToList(); 
    el.Attributes().Remove(); 
    foreach (var at in atList) 
    { 
    if (el.Name.LocalName == "Catalog" && at.Name.LocalName != "xmlns") 
     continue; 
    el.Add(new XAttribute(at.Name.LocalName, at.Value)); 
    } 
} 

container.Add(new XAttribute(XNamespace.Xmlns + "x", xaml)); 
container.Add(new XAttribute(XNamespace.Xmlns + "sys", mscorlib)); 
container.Add(new XAttribute(XNamespace.Xmlns + "myPrefix", myPrefix)); 

編輯4:
顯然有一種更簡單的方法...輕鬆很多......看到其他的答案。

+0

感謝您的回答,但它不起作用。結果是這樣的: Peter 2011-05-12 08:17:07

+1

@Peter:如果元素是根。它不是根,那麼如果名稱空間是在祖先中聲明的話,它將被加上前綴。 – 2011-05-12 08:43:16

+0

@Jeff我該如何讓它在正確的方式下工作? – Peter 2011-05-12 08:50:04

7
XElement container = XElement.Parse(xml); 
    XNamespace myPrefix = container.GetNamespaceOfPrefix("myPrefix"); 

    XElement xmlTree = new XElement(myPrefix + "Item",  
          new XAttribute("Name", item.Name), 
          new XAttribute("Mode", item.Mode)); 

    container.Add(xmlTree); 
+0

+1不錯!我知道必須有一個更簡單的方法。 – 2011-05-12 19:00:05

2

您需要在名稱空間中構建任何新元素。假設你知道XML樣本中你想要的命名空間的前綴,那麼按照以下步驟操作:

var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>"; 

    XElement catalog = XElement.Parse(xml); 

    XNamespace myP = catalog.GetNamespaceOfPrefix("myPrefix"); 

    catalog.Add(new XElement(myP + "Item", new XAttribute("Name", "foo"), new XAttribute("Mode", "bar"))); 
+0

+1不錯!我知道必須有一個更簡單的方法。 – 2011-05-12 18:59:57

+0

非常感謝這個不錯的解決方案。 – Peter 2011-05-17 09:48:07