带有文本节点的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:我发现,具有文本节点的节点会打乱节点的其余格式。当我删除文本节点时,格式看起来就像它应该的那样,适当地缩进。但是对于文本节点,整个后代分支被视为一个没有应用格式化的长文本节点。
我不确定这是否是您的整个问题,但在文本节点(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);