带有文本节点的XElement节点其格式被忽略

本文关键字:节点 格式 XElement 文本 | 更新日期: 2023-09-27 18:01: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(),我试过使用xmltextwwriter与格式缩进选项,甚至这个方法我发现在另一个帖子这里

        //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);
        //}

似乎什么都不起作用。

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

我如何在输出中防止或修复它?

EDIT:我发现,具有文本节点的节点会打乱节点的其余格式。当我删除文本节点时,格式看起来就像它应该的那样,适当地缩进。但是对于文本节点,整个后代分支被视为一个没有应用格式化的长文本节点。

带有文本节点的XElement节点其格式被忽略

我不确定这是否是您的整个问题,但在文本节点(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;

添加LoadOptions似乎解决了这个问题。PreserveWhitespace

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