【问题标题】:XElement node with text node has its formatting ignored带有文本节点的 XElement 节点的格式被忽略
【发布时间】:2014-05-04 02:42:37
【问题描述】:

对于我的 XDocument 的一部分,看起来像这样

<name>
    xEdKXBh
   <first>kryrIQvg</first>
   <family>kHymPPId</family>
</name>

我正在像这样修改特定的节点分支

                switch (node.NodeType)
                {
                    case XmlNodeType.Text:
                        var xtext = (XText)node; 
                        xtext.Value = "somstring"
                        break;
                    case XmlNodeType.Element:
                        var xelement = (XElement)node;
                        xelement.Value = "somstring"
                        break;
                    default:
                        //Console.WriteLine(node);
                        break;
                }

但无论我尝试了什么,我修改的部分总是这样结束,但文档的其余部分保持完美的格式不变。

    <name>
    xEdKXBh
      <first>kryrIQvg</first><family>kHymPPId</family></name>

我尝试过使用 XDocument.ToString(),我尝试过使用带有 Formattign Indented 选项的 XmlTextWriter,甚至我在另一篇文章中找到的这个方法

        //StringBuilder sb = new StringBuilder();
        //XmlWriterSettings settings = new XmlWriterSettings();
        //settings.Indent = true;
        //settings.IndentChars = "  ";
        //settings.NewLineChars = "\r\n";
        //settings.NewLineHandling = NewLineHandling.Replace;
        //using (XmlWriter writer = XmlWriter.Create(sb, settings))
        //{
        //    doc.Save(writer);
        //}

似乎没有任何效果。

为什么修改这些节点会删除开头的格式?

我怎样才能在输出中防止或修复它?

编辑: 我发现具有文本节点的节点会弄乱节点的剩余格式。当我删除文本节点时,格式看起来应该是正确的缩进。但是对于文本节点,后代的整个分支被视为一个没有应用格式的长文本节点。

【问题讨论】:

    标签: c# .net xml


    【解决方案1】:

    我不确定这是否是您遇到的全部问题,但对于文本节点 (XText),空格(换行符和缩进)是节点值的一部分。

    因此,如果您想保留它们,请尝试仅替换文本节点值的非空白部分,例如:

    case XmlNodeType.Text:
        var xtext = (XText)node;
        //get non-whitespace part
        var oldValue = xtext.Value.Trim();
        //replace only non-whitespace part
        xtext.Value = xtext.Value.Replace(oldValue, "some string");
        break;
    

    【讨论】:

    • 这不是文本节点的问题,我知道我负责处理文本中的空格和换行符。但是当我修改节点时,节点之间的换行符会变得混乱。似乎正在发生一些事情,例如节点分支正在被修改格式(缩进)写回 XDocument
    • 我发现了一些奇怪的东西,我发现不是我对 XElement 的修改导致了格式问题,它在阅读时就发生了。仅仅因为 标记之前的 标记内有文本,就导致其余标记的格式被删除。当我删除该文本并仅在 中有子节点时,格式不变并且可以正常工作
    【解决方案2】:

    这似乎解决了它 - 添加 LoadOptions.PreserveWhitespace

    XDocument DocumentRoot = XDocument.Parse(inputValue,LoadOptions.PreserveWhitespace);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2014-10-10
      • 2014-09-11
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多