[英]Creating XML Elements without namespace declarations
我嘗試向以下 XML 文件添加新的“PropertyGroup”元素
<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>
如何擺脫元素上的命名空間聲明?
您需要為添加到 DOM 的所有元素指定 XML 命名空間:
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
),則該元素將獲得可怕的空命名空間。
發生這種情況的原因是您已通過在根節點上定義命名空間,將文檔的默認命名空間定義為“ http://schemas.microsoft.com/developer/msbuild/2003 ”:
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
然后繼續向文檔添加一個沒有命名空間(“空”命名空間)的元素。 這必須有合格
xmlns=""
因為如果不是,則意味着新元素在前面提到的 Microsoft 命名空間中 - 它不是(或者更確切地說 - 你沒有要求它)。
所以要么:
您實際上希望新元素位於 Microsoft 命名空間中 - 在這種情況下,您需要這么說。 最簡單的方法是使用 createElement 並提供命名空間,盡管您可以使用 InnerXml 上的 xmlns 屬性顯式聲明它(這不是一種特別好的添加節點的方法)。
您確實希望此元素位於空命名空間中,在這種情況下,您最好使用命名空間前綴來限定不在空命名空間中的所有其他節點。
我懷疑你想要前者。
可以在此處找到有關命名空間的快速概覽。
為了避免在新創建的元素中出現額外的xmlns=""
屬性,您可以將根命名空間作為參數傳遞:
$child = $doc.CreateElement("value", $doc.DocumentElement.NamespaceURI);
$res = $doc.PropertyGroup.AppendChild($child); # res here to avoid extra output
這將導致
<PropertyGroup>
<value></value>
</PropertyGroup>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.