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

时间:2014-05-04 02:42:38

标签: c# .net xml

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

似乎没什么用。

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

如何防止这种情况或在输出中修复它?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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