我的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);
//}
似乎没什么用。
为什么修改这些节点会删除格式化开头?
如何防止这种情况或在输出中修复它?
编辑:我发现有文本节点的节点会混淆剩余的节点格式。当我删除文本节点时,格式看起来应该正确缩进。但是对于文本节点,后代的整个分支被视为一个没有应用格式的长文本节点。
答案 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);