如何在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
相关产品推荐
相关产品推荐

