.Net中如何使用自定义标签编写指定结构的XML文件?
在.NET中生成带自定义标签的XML文件:配置化 vs 逐行写入?
嘿,你问的这个问题其实在.NET里有更优雅的解决办法,完全不用费劲手动逐行写XML字符串,咱们来一步步说清楚可行的方案,以及为什么不推荐逐行写的方式:
方式一:XML序列化(推荐的配置化思路)
这本质是通过定义C#类来「配置」XML的结构,让.NET自动帮你生成符合要求的XML,完全不用手动拼接标签,维护起来特别省心。
首先,根据你需要的XML结构,定义对应的实体类(相当于用类结构配置XML的层级):
using System.Xml.Serialization; // 对应根节点ABC [XmlRoot("ABC", Namespace = "http://anySchemaAddress")] public class AbcRoot { [XmlAttribute("version")] public string Version { get; set; } = "1"; public string Date { get; set; } public Contract Contract { get; set; } } // 对应Contract子节点 public class Contract { public string Type { get; set; } public string Key { get; set; } public string ContractNumber { get; set; } public string Value { get; set; } public string HoldBackDate { get; set; } }
然后编写序列化代码,把对象数据转换成XML并保存到文件:
using System.Xml.Serialization; using System.IO; // 初始化要写入的数据 var abcData = new AbcRoot { Date = "20140922", Contract = new Contract { Type = "1", Key = "1000012", ContractNumber = "1234567X90", Value = "661.00", HoldBackDate = "20181231" } }; // 序列化并保存到文件 var serializer = new XmlSerializer(typeof(AbcRoot)); using var writer = new StreamWriter("output.xml"); serializer.Serialize(writer, abcData);
生成的XML会完全匹配你要的结构,包括命名空间、属性和节点层级,后续要修改结构或者数据,只需要调整类或对象即可,属于标准的「配置化」实现方式。
方式二:用XDocument手动构建(无需逐行写文件)
如果不想定义实体类,也可以用LINQ to XML的XDocument来手动构建节点,比直接写字符串靠谱得多,不会出现标签不闭合这类低级错误:
using System.Xml.Linq; var xmlNamespace = XNamespace.Get("http://anySchemaAddress"); var xmlDoc = new XDocument( new XElement(xmlNamespace + "ABC", new XAttribute("version", "1"), new XElement(xmlNamespace + "Date", "20140922"), new XElement(xmlNamespace + "Contract", new XElement(xmlNamespace + "Type", "1"), new XElement(xmlNamespace + "Key", "1000012"), new XElement(xmlNamespace + "ContractNumber", "1234567X90"), new XElement(xmlNamespace + "Value", "661.00"), new XElement(xmlNamespace + "HoldBackDate", "20181231") ) ) ); // 保存到文件 xmlDoc.Save("output.xml");
这种方式适合临时的简单XML生成,但结构复杂时还是序列化的方式更清晰易维护。
不推荐:逐行写入文件
直接用StreamWriter逐行写XML字符串当然能实现,但很容易踩坑——比如忘记闭合标签、命名空间写错、字符转义问题(比如数据里有&或<时,直接写会导致XML无效),除非是极端简单的场景,否则完全没必要这么做。
内容的提问来源于stack exchange,提问作者FlorianQo
相关产品推荐
相关产品推荐

