【问题标题】:XmlDocument InnerXml FormattingXmlDocument InnerXml 格式化
【发布时间】:2011-12-12 17:03:32
【问题描述】:

我有一个文档,我要在其上替换某个节点的内部 XML:

    var xmlReplacement = File.ReadAllText(path); // this xml is well formatted with indentations itself, but not indented at the correct level for the document it's about to be inserted into

    var document = new XmlDocument();
    document.PreserveWhitespace = true;
    document.Load(path);

    // replace inner xml of ContainingNode
    var node = document.SelectSingleNode("//ContainingNode");
    node.InnerXml = xmlReplacement;

    // write back to the output file
using (var writer = new XmlTextWriter(path, null))
{
    writer.Formatting = Formatting.Indented;
    document.WriteTo(writer);
}

我最终得到了新的内部 xml 非缩进(一直到左侧),并且关闭节点与我的替换 xml 节点的关闭位于同一行。

我怎样才能做到这一点?

【问题讨论】:

  • 也许尝试将 xmlReplacement 解析为新的 XmlDocument 并使用 node.RemoveAll 和 node.AppendChild 添加替换?
  • 你为什么关心缩进? XML 不关心,那你为什么要关心呢?
  • 因为人们必须使用这个文件。如果有人运行替换代码并将文件签入源代码管理会发生什么?然后其他人手动打开 xml 文件,编辑某些内容并重新格式化它?现在差异化是一件很痛苦的事情。

标签: .net xml xmldocument xmlwriter


【解决方案1】:

类似的东西可能会奏效。让模式为您完成缩进工作。

var node = document.SelectSingleNode("//ContainingNode");

node.RemoveAll();
using (var tr = XmlReader.Create(xmlReplacement))
{
    while (tr.Read())
    {
        node.AppendChild(tr);
    }
}

编辑:更改为删除过时的 XmlTextReader 编辑2:改为使用using

【讨论】:

  • -1 用于使用 new XmlTextReader(),自 .NET 2.0 起已弃用。
  • 谢谢。我不是要一个严格的答案,而是一个方向,但任何输入都是有帮助的。我的答案已被修改。
  • Same -1: using 块在tr 周围怎么样?
  • 再一次,我不想给出解析 XML 的明确方法,我只是指出一个追求的方向。无论如何,我在示例中添加了 using 块。
  • XmlNode.AppendChild 似乎没有使用 XmlReader...这一点比您的样本是否有 using 块更重要...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2020-06-09
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多