You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何将文本文件属性动态转为XML节点属性

解决C#生成带动态属性的XML问题

问题分析

你当前的代码会将动态属性生成为<test>的子元素,但需求是把这些动态属性直接作为<test>节点的属性。核心问题在于:

  1. info类中的advancedSettings是List<AdvancedSettings>,默认XML序列化会生成嵌套子元素,而非父节点属性;
  2. 错误实现了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:57:49