使用C#中XDocument编辑XML文件时的缩进异常问题
解决XML新增元素未正确缩进的问题
嘿,这个问题我之前也碰到过,症结其实出在你加载文档时用的LoadOptions.PreserveWhitespace上!
问题根源
当你用LoadOptions.PreserveWhitespace加载XDocument时,它会原封不动保留文档里所有的空白节点——包括原有元素之间的换行、缩进空格。这时候你添加新元素后,XmlWriter的Indent=true设置不会重新格式化整个文档,因为它会优先尊重已存在的空白节点。结果就是新元素直接被追加到最后一个原有元素的末尾,没有正确的换行和缩进,最后还跟根元素的结束标签挤在了一起。
两种解决方案
方案1:加载时不保留空白(推荐,适合大多数场景)
如果你的XML文档里没有需要特意保留的空白内容(比如元素文本里的空格格式),直接去掉LoadOptions.PreserveWhitespace加载文档即可。这样XDocument会自动忽略无关的空白,保存时XmlWriterSettings的Indent=true就会统一格式化整个文档,新元素会和原有元素保持一致的缩进:
// 去掉LoadOptions.PreserveWhitespace XDocument xmlDoc = XDocument.Load(filePath); // 添加新元素的代码不变 myGroup.Add(new XElement(ns + "NewElement", "Inserted by code")); // 保存代码也不变 var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8, Indent = true }; using (var writer = XmlWriter.Create(filePath, settings)) { xmlDoc.Save(writer); }
方案2:手动添加空白节点(适合必须保留原有空白的场景)
如果你确实需要保留原有文档的空白格式,可以手动在新元素前后添加对应的空白节点,模拟原有缩进:
// 加载文档时依然保留空白 XDocument xmlDoc = XDocument.Load(filePath, LoadOptions.PreserveWhitespace); // 获取MyGroup元素 var myGroup = xmlDoc.Element(ns + "MyGroup"); // 先添加换行+两个空格的空白节点(和原有缩进一致) myGroup.Add(new XText("\n ")); // 添加新元素 myGroup.Add(new XElement(ns + "NewElement", "Inserted by code")); // 最后添加一个换行节点,让根元素的结束标签单独占一行 myGroup.Add(new XText("\n")); // 保存代码不变 var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8, Indent = true }; using (var writer = XmlWriter.Create(filePath, settings)) { xmlDoc.Save(writer); }
这样处理后,你编辑后的XML就会变成正常的格式:
return (<MyGroup> <ExistingElement1>a value</ExistingElement1> <ExistingElement2>something else</ExistingElement2> <NewElement>Inserted by code</NewElement> </MyGroup> )
内容的提问来源于stack exchange,提问作者Techromancer
相关产品推荐
相关产品推荐

