2011-03-30 63 views
8

我嘗試了新的「的PropertyGroup」元素添加到下面的XML文件沒有命名空間聲明創建XML元素

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <PropertyGroup> 
    <ProjectGuid>{00AA7ECA-95A0-0000-0000-AD4D2E056BFE}</ProjectGuid> 
    <OutputType>Library</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>testnS</RootNamespace> 
    <AssemblyName>testname</AssemblyName> 
    <PluginId>4B84E5C0-EC2B-4C0C-8B8E-3FAEB09F74C6</PluginId> 
    </PropertyGroup> 
</Project> 

我使用的代碼如下(注意,已刪除其他邏輯) :

 XmlTextReader reader = new XmlTextReader(filename); 
     XmlDocument doc = new XmlDocument(); 

     doc.Load(reader); 
     reader.Close(); 

     XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
     ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); 

     XmlElement root = doc.DocumentElement; 
     XmlNode refNode = root.SelectSingleNode("x:Project", ns); 

     root.SelectSingleNode("Project", ns); 

     XmlElement newElement = doc.CreateElement("PropertyGroup", "http://schemas.microsoft.com/developer/msbuild/2003"); 
     newElement.InnerXml = "<value>test</value>"; 
     root.InsertAfter(newElement, refNode); 
     doc.Save(filename); 

這產生XML文檔中的下列新元素:

<PropertyGroup> 
    <value xmlns="">test</value> 
</PropertyGroup> 

如何擺脫元素上的名稱空間聲明?

+0

你必須在這裏使用InnerXml屬性嗎?明確地做它會更容易。 (如果這是一個選項,使用LINQ to XML會更容易。) – 2011-03-30 07:43:08

+0

不確定LINQ to XML - LINQ對我來說是一個未知數...:-) – 2011-03-30 07:56:29

+0

但我剛剛發現這個:http://stackoverflow.com/questions/2013165/linq-to-xml-adding-an-element – 2011-03-30 07:59:10

回答

10

您需要指定XML命名空間所有元素添加到DOM:

XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); 

XmlElement root = doc.DocumentElement; 
XmlNode refNode = root.SelectSingleNode("x:Project", ns); 

XmlElement newElement = doc.CreateElement(
    "PropertyGroup", 
    "http://schemas.microsoft.com/developer/msbuild/2003"); 
var value = newElement.AppendChild(doc.CreateElement(
    "value", 
    "http://schemas.microsoft.com/developer/msbuild/2003")); 
value.AppendChild(doc.CreateTextNode("test")); 

root.InsertAfter(newElement, refNode); 

如果你沒有任何元素這樣做(或者,如果您使用InnerXml那樣),那元素將得到可怕的空名稱空間。

3

出現這種情況的原因是,你已經通過具有根節點的命名空間定義中定義的默認命名空間的文件成爲「http://schemas.microsoft.com/developer/msbuild/2003」:

xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 

你然後進行添加元素它不在文檔的命名空間('空'命名空間)中。這已經

xmlns="" 

合格,因爲如果不是那就意味着新的元素是在前面提到的微軟命名空間 - 它不是(或者說 - 你沒有問它是)。

因此,要麼:

  • 你真的想 新元素是在微軟的命名空間 - 在 你需要這麼說這種情況。該 最簡單的方法是使用的createElement 和供應的命名空間,雖然 你可能它明確 與xmlns屬性您 InnerXml(這是不添加節點的一個特別 很好的方式)的狀態。

  • 你真的想要這個元素 空命名空間,你 在這種情況下,可能是更好的排位賽都 不在同一個命名空間 前綴 空命名空間中的其他節點。

我懷疑你想要前者。

有關命名空間的快速概述可參見here