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

如何在C#类中存储原始XML元素?

可以在C#类中存储原始XML元素吗?

当然可以!针对你提到的场景——既要解析已知的XML属性,又要保留原始的XML片段(尤其是部分XML结构在设计时无法预先确定的情况),这里有几种实用的实现方式:

方案1:手动捕获原始XML字符串

这是最直接的方式:先把整个<data>节点读取为字符串,再反序列化为Data类,最后把原始字符串赋值给类的属性。这样既能拿到解析后的属性值,又能保留原始XML:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace Xml2CSharp
{
    [XmlRoot(ElementName="data")]
    public class Data
    {
        [XmlAttribute(AttributeName="someattributea")]
        public string Someattributea { get; set; }

        [XmlAttribute(AttributeName="someattributeb")]
        public string Someattributeb { get; set; }

        [XmlAttribute(AttributeName="someattributec")]
        public string Someattributec { get; set; }

        // 用[XmlIgnore]标记,避免序列化时出现循环或冗余内容
        [XmlIgnore]
        public string SourceXML { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string originalXml = "<data someattributea=\"val1\" someattributeb=\"val2\" someattributec=\"val3\" />";
            
            // 先提取原始XML节点的完整字符串
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(originalXml);
            string rawDataXml = doc.DocumentElement.OuterXml;

            // 反序列化为Data对象
            XmlSerializer serializer = new XmlSerializer(typeof(Data));
            using (StringReader reader = new StringReader(originalXml))
            {
                Data dataObj = (Data)serializer.Deserialize(reader);
                dataObj.SourceXML = rawDataXml;
                
                // 此时dataObj.SourceXML就是你要的原始<data>元素内容
                Console.WriteLine(dataObj.SourceXML);
            }
        }
    }
}

方案2:实现IXmlSerializable接口(灵活适配未知结构)

如果需要更精细地控制序列化/反序列化流程,同时完美捕获原始XML,可以实现IXmlSerializable接口。这种方式特别适合处理设计时未知的XML结构:

using System;
using System.Xml;
using System.Xml.Serialization;

namespace Xml2CSharp
{
    public class Data : IXmlSerializable
    {
        public string Someattributea { get; set; }
        public string Someattributeb { get; set; }
        public string Someattributec { get; set; }
        public string SourceXML { get; set; }

        public XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
            // 先读取当前节点的完整原始XML
            reader.MoveToContent();
            SourceXML = reader.ReadOuterXml();
            
            // 从原始XML中解析已知属性
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(SourceXML);
            XmlElement dataElement = doc.DocumentElement;
            
            Someattributea = dataElement.GetAttribute("someattributea");
            Someattributeb = dataElement.GetAttribute("someattributeb");
            Someattributec = dataElement.GetAttribute("someattributec");
        }

        public void WriteXml(XmlWriter writer)
        {
            // 序列化时可以直接输出原始XML,也可以自定义输出逻辑
            writer.WriteRaw(SourceXML);
        }
    }
}

方案3:用XmlAnyAttribute捕获未知属性(补充场景)

如果你的核心需求是保留未知的XML属性(而非整个元素的原始XML),可以用XmlAnyAttribute特性来自动捕获所有未预先定义的属性,之后还能重新生成包含所有属性的XML:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace Xml2CSharp
{
    [XmlRoot(ElementName="data")]
    public class Data
    {
        [XmlAttribute(AttributeName="someattributea")]
        public string Someattributea { get; set; }

        [XmlAttribute(AttributeName="someattributeb")]
        public string Someattributeb { get; set; }

        [XmlAttribute(AttributeName="someattributec")]
        public string Someattributec { get; set; }

        // 自动捕获所有未定义的属性
        [XmlAnyAttribute]
        public XmlAttribute[] UnknownAttributes { get; set; }

        // 生成包含所有属性的原始XML字符串
        public string GetSourceXML()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Data));
            using (StringWriter sw = new StringWriter())
            {
                serializer.Serialize(sw, this);
                return sw.ToString();
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者RapMaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:57:44