如何让XmlDocument生成的XML字符串包含换行符而非单行输出?
解决XmlDocument生成XML无换行的问题
嘿,我之前也碰到过这个麻烦!你现在用OuterXml直接获取的XML字符串确实是压缩成单行的——毕竟OuterXml本身就是为了生成紧凑、适合网络传输的XML设计的。要让输出带换行和缩进,得借助XmlWriter系列的类来处理,给你两种实用的方案:
方案1:使用XmlTextWriter(兼容旧版.NET)
这种方式比较经典,适合维护.NET Framework早期版本的项目:
XmlDocument xml = new XmlDocument(); XmlElement root = xml.CreateElement("customers"); xml.AppendChild(root); foreach (var cust in customerlist) { XmlElement child = xml.CreateElement("customer"); child.SetAttribute("CustomerId", cust.CustomerId.ToString()); child.SetAttribute("CustomerName", cust.CustomerName); child.SetAttribute("PhoneNumber", cust.PhoneNumber); child.SetAttribute("Email", cust.Email); root.AppendChild(child); } // 替换原来的OuterXml获取逻辑 using (StringWriter sw = new StringWriter()) using (XmlTextWriter writer = new XmlTextWriter(sw)) { writer.Formatting = Formatting.Indented; // 开启缩进换行 writer.Indentation = 2; // 设置缩进为2个空格,可按需调整 xml.WriteTo(writer); string formattedXml = sw.ToString(); // 这就是带格式的XML字符串了 }
方案2:使用XmlWriterSettings(推荐,适配现代.NET)
如果你的项目是.NET Framework 2.0+或者.NET Core/.NET 5+,更推荐这种方式,配置更灵活:
XmlDocument xml = new XmlDocument(); XmlElement root = xml.CreateElement("customers"); xml.AppendChild(root); foreach (var cust in customerlist) { XmlElement child = xml.CreateElement("customer"); child.SetAttribute("CustomerId", cust.CustomerId.ToString()); child.SetAttribute("CustomerName", cust.CustomerName); child.SetAttribute("PhoneNumber", cust.PhoneNumber); child.SetAttribute("Email", cust.Email); root.AppendChild(child); } // 配置格式化参数 XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = " "; // 用两个空格缩进,换成"\t"就是制表符缩进 settings.NewLineChars = Environment.NewLine; // 自动适配系统换行符 using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { xml.WriteTo(writer); string formattedXml = sw.ToString(); }
小提示
两种方案的核心都是通过专门的XML写入器生成格式化输出,而非直接调用OuterXml。生成后的XML会自动给每个节点添加换行和缩进,结构一目了然,非常方便调试和查看。
内容的提问来源于stack exchange,提问作者Breathing
相关产品推荐
相关产品推荐

