如何让XmlDocument.Save保留编写新元素的命名空间?

时间:2014-01-17 15:07:58

标签: xml powershell

我编写了一个PowerShell脚本,该脚本可以查看XML并取消注释某些项目。 我这样做的方法是删除评论并创建新的XmlElement对象来取代它。

我的问题是当我将文件保存在现有文件上时,XmlDocument会在我的根元素xmlns=""中添加一个额外的属性。 在保存之前,我使用调试器查看XmlDocument对象,我的新元素OuterXml具有以下结构:

  <register type="IComStack" mapTo="ComStackEth">
    <lifetime type="singleton" />
    <constructor>
      <param name="host" type="System.Net.IPAddress">
        <value value="127.0.0.1" typeConverter="IPAddressTypeConverter" />
      </param>
    </constructor>
  </register>

保存后我查看文件,我的元素如下所示:

  <register type="IComStack" mapTo="ComStackEth" xmlns="">
    <lifetime type="singleton" />
    <constructor>
      <param name="host" type="System.Net.IPAddress">
        <value value="127.0.0.1" typeConverter="IPAddressTypeConverter" />
      </param>
    </constructor>
  </register>

然后我回到调试器并再次查看我的元素,我以正确的格式看到它,即没有xmlns属性。

我使用$config.Save($configPath)顶部保存我的xml并使用以下方法加载它:

$config= new-object System.Xml.XmlDocument
$config.Load($configPath)

有谁知道如何阻止XmlDocument.Save添加命名空间属性?

1 个答案:

答案 0 :(得分:3)

  

有谁知道如何阻止XmlDocument.Save添加命名空间属性?

通过在正确的命名空间中创建元素。

孤立地,XML文档

  <register type="IComStack" mapTo="ComStackEth">
    <lifetime type="singleton" />
    <constructor>
      <param name="host" type="System.Net.IPAddress">
        <value value="127.0.0.1" typeConverter="IPAddressTypeConverter" />
      </param>
    </constructor>
  </register>

包含许多具有各种本地名称和 no 命名空间的元素。和XML文档

<root xmlns="http://example.com">
  <!-- content goes here -->
</root>

root命名空间中包含名为http://example.com的元素。如果要将子节点添加到此root元素,并且这些节点不在http://example.com命名空间中,则序列化程序必须添加合适的命名空间声明 - 如果它没有添加{ {1}}然后结果将不正确,因为以前没有命名空间的元素会“移动”到xmlns=""命名空间。

http://example.com

事实上,根据XML名称空间的规则, 调试器最终的XML文档是正确的。

如果要避免让序列化程序添加<root xmlns="http://example.com"> <register type="IComStack" mapTo="ComStackEth" xmlns=""> <lifetime type="singleton" /> <constructor> <param name="host" type="System.Net.IPAddress"> <value value="127.0.0.1" typeConverter="IPAddressTypeConverter" /> </param> </constructor> </register> </root> ,则需要确保使用与要添加它们的父元素相同的命名空间创建要插入的节点。具体如何实现这一点取决于您创建xmlns=""对象的方式。