C#中如何将文本文件属性动态转为XML节点属性
解决C#生成带动态属性的XML问题
问题分析
你当前的代码会将动态属性生成为<test>的子元素,但需求是把这些动态属性直接作为<test>节点的属性。核心问题在于:
info类中的advancedSettings是List<AdvancedSettings>,默认XML序列化会生成嵌套子元素,而非父节点属性;- 错误实现了
ISerializable接口(该接口主要用于二进制序列化,XML序列化应使用IXmlSerializable)。
解决方案
我们可以通过实现IXmlSerializable接口手动控制XML序列化,结合字典存储动态属性,来达到需求效果。
1. 重新设计类结构
用字典存储动态属性,让TestInfo类实现IXmlSerializable来自定义XML输出:
using System.Collections.Generic; using System.Xml; using System.Xml.Serialization; [XmlRoot("btm")] public class Btm { [XmlElement("test")] public List<TestInfo> Information { get; set; } = new List<TestInfo>(); } public class TestInfo : IXmlSerializable { // 固定属性 public string Testin { get; set; } public bool Isform { get; set; } public string Address { get; set; } public string Type { get; set; } // 存储动态属性的字典(键=属性名,值=属性值) public Dictionary<string, string> DynamicAttributes { get; set; } = new Dictionary<string, string>(); // XML序列化必须的无参构造函数 public TestInfo() { } // 实现IXmlSerializable接口方法(反序列化可按需实现) public XmlSchema GetSchema() => null; public void ReadXml(XmlReader reader) { // 若需要反序列化XML到对象,可在此实现逻辑,当前示例略过 reader.Read(); } public void WriteXml(XmlWriter writer) { // 输出固定属性 writer.WriteAttributeString("testin", Testin); writer.WriteAttributeString("isform", Isform.ToString().ToLower()); writer.WriteAttributeString("address", Address); writer.WriteAttributeString("Type", Type); // 输出动态属性 foreach (var kvp in DynamicAttributes) { writer.WriteAttributeString(kvp.Key.Trim(), kvp.Value ?? string.Empty); } } }
2. 读取文本文件并生成XML
假设你的文本文件每行格式为属性名或属性名=属性值,读取后填充到字典,再序列化XML:
using System.IO; using System.Xml.Serialization; // 从文本文件读取动态属性 var dynamicAttrs = new Dictionary<string, string>(); foreach (var line in File.ReadAllLines("dynamic_attributes.txt")) { if (string.IsNullOrWhiteSpace(line)) continue; var parts = line.Split(new[] { '=' }, 2); var attrName = parts[0].Trim(); var attrValue = parts.Length > 1 ? parts[1].Trim() : string.Empty; dynamicAttrs[attrName] = attrValue; } // 构造XML数据 var btm = new Btm(); var testItem = new TestInfo { Testin = "abc", Isform = true, Address = "0", Type = "9", DynamicAttributes = dynamicAttrs }; btm.Information.Add(testItem); // 序列化到XML文件 var serializer = new XmlSerializer(typeof(Btm)); using (var writer = new StreamWriter("output.xml")) { serializer.Serialize(writer, btm); }
3. 效果说明
运行上述代码后,生成的XML会符合你的需求:动态属性直接作为<test>节点的属性,不再生成嵌套的<advancedSettings>子元素。
内容的提问来源于stack exchange,提问作者mili
相关产品推荐
相关产品推荐

