簡體   English   中英

創建沒有命名空間聲明的 XML 元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM