如何使用XDocument保留XML多行属性的格式?
解决LINQ to XML保存时丢失属性换行格式的问题
问题原因
你使用XDocument的LoadOptions.PreserveWhitespace和SaveOptions.DisableFormatting无效,是因为LINQ to XML解析XML时,属性之间的换行、缩进空白不会被识别为文档节点的一部分,加载后这些格式信息会丢失,自然无法通过保存选项恢复。
解决方案
方案1:用XmlDocument精准保留原始格式
如果需要完全还原XML原始的属性换行和缩进,推荐使用XmlDocument,它对空白的保留机制更适配这类需求:
XmlDocument xmlDoc = new XmlDocument(); // 开启空白保留 xmlDoc.PreserveWhitespace = true; xmlDoc.Load(xmlCondigurationPath); // 执行属性修改操作(示例) XmlNode addNode = xmlDoc.SelectSingleNode("//add"); if (addNode != null) { addNode.Attributes["attribute2"].Value = "updatedValue"; } // 保存时自动保留原始格式 xmlDoc.Save(xmlCondigurationPath);
方案2:用XDocument配合XmlWriterSettings生成多行属性
如果坚持使用XDocument,可以通过自定义XmlWriterSettings强制让属性单独换行,虽无法100%还原原始空白细节,但能实现类似的多行展示效果:
XDocument xmlFile = XDocument.Load(xmlCondigurationPath); // 执行属性修改操作(示例) xmlFile.Root.Element("add")?.Attribute("attribute2")?.SetValue("updatedValue"); // 配置输出格式 XmlWriterSettings settings = new XmlWriterSettings { Indent = true, NewLineOnAttributes = true, // 关键设置:每个属性单独一行 IndentChars = " ", // 匹配原始缩进的空格数 OmitXmlDeclaration = false // 根据你的XML是否需要声明调整 }; // 用自定义设置保存 using (XmlWriter writer = XmlWriter.Create(xmlCondigurationPath, settings)) { xmlFile.Save(writer); }
内容的提问来源于stack exchange,提问作者saqibhaneef
相关产品推荐
相关产品推荐

