【问题标题】:How do I keep XmlDocument.Save from writing namespaces of new elements?如何防止 XmlDocument.Save 编写新元素的命名空间?
【发布时间】:2014-01-17 23:28:43
【问题描述】:

我编写了一个 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 添加命名空间属性?

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    有谁知道如何防止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>
    

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

    <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>
    

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

    如果您想避免让序列化程序添加xmlns="",那么您需要确保您要插入的节点是使用与要添加它们的父元素相同的命名空间创建的。具体如何实现这一点取决于您创建XmlElement 对象的方式。

    【讨论】:

    • 老实说,我对这个特定规则并不熟悉。你的解决方案奏效了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2019-09-24
    • 2014-03-31
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多