最推荐使用XDocument动态创建XML,语法简洁、自动处理转义和编码;其次可选XmlDocument(兼容旧项目)或XmlSerializer(适合固定结构的对象序列化)。

用C#生成XML文件最推荐的方式是使用 XmlDocument 或更现代的 XDocument(来自 System.Xml.Linq),它们支持动态构建、结构清晰、不易出错。直接字符串拼接虽然可行,但容易引发格式错误或转义问题,不建议用于生产环境。
用 XDocument 动态创建 XML(推荐)
XDocument 是 LINQ to XML 的核心类,语法简洁、功能强大,适合大多数动态生成场景。
- 先引入命名空间:using System.Xml.Linq;
- 创建根元素,再逐层添加子元素、属性和文本内容
- 调用 Save() 方法写入文件,自动处理缩进和编码
示例:生成一个带属性和嵌套节点的配置文件
XDocument doc = new XDocument(
new XElement("Config",
new XAttribute("version", "1.2"),
new XElement("Database",
new XAttribute("type", "SqlServer"),
new XElement("Server", "localhost"),
new XElement("Name", "MyAppDB")
),
new XElement("Logging",
new XElement("Level", "Info"),
new XElement("Path", @"C:\Logs\app.log")
)
)
);
doc.Save("config.xml"); // 自动保存为格式化 XML
用 XmlDocument 创建 XML(兼容老项目)
XmlDocument 更底层,适合需要精细控制节点生命周期或需与旧代码集成的场景。
- 用 CreateElement() 和 CreateAttribute() 构建节点
- 通过 AppendChild() 或 PrependChild() 组织层级
- 调用 Save() 前可设置 XmlDocument.PreserveWhitespace = false 确保格式整洁
示例:
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("Users");
doc.AppendChild(root);
XmlElement user = doc.CreateElement("User");
user.SetAttribute("id", "101");
user.AppendChild(doc.CreateElement("Name")).InnerText = "张三";
user.AppendChild(doc.CreateElement("Email")).InnerText = "zhang@example.com";
root.AppendChild(user);
doc.Save("users.xml");
处理特殊字符与编码问题
XML 对 、>、&、"、' 等字符有严格转义要求,XDocument 和 XmlDocument 都会自动处理——只要你不手动拼接字符串。
- 避免用
+"这类拼接方式" + name + " " - 若内容来自用户输入或数据库,务必用 XElement("Name", userInput) 或 doc.CreateTextNode(userInput)
- 保存时默认使用 UTF-8 编码;如需指定编码,可用 XmlWriter 配合 XmlWriterSettings
从对象序列化生成 XML(适合数据结构固定)
如果已有 C# 类,且字段/属性与 XML 结构基本对应,可用 XmlSerializer 快速生成。
- 类需标记 [Serializable] 或用 [XmlElement] 控制节点名
- 注意:只序列化公共字段和属性,不支持字典、匿名类型等复杂结构
- 性能略低于 XDocument,但开发效率高
示例:
[Serializable]
public class Person
{
[XmlElement("FullName")] public string Name { get; set; }
public int Age { get; set; }
}
var person = new Person { Name = "李四", Age = 28 };
var serializer = new XmlSerializer(typeof(Person));
using (var writer = new StreamWriter("person.xml"))
serializer.Serialize(writer, person);










