将 xml 反序列化为具有 xml 中的字符串值的 class

Deserialize xml into class having string values in xml

让我解释一下,有一个数据库 table,它有 1 个 XML 列,名为 audits 和其他常见类型的列。

因此可以将 XML 以下反序列化为 class。

<?xml version="1.0"?>
<entity type="Order">
    <id type="System.Int64">146</id>
    <ordernumber type="System.String">OD555</ordernumber>
    <audits type='System.String'>
      <audit>
        <item>
          <create timestamp='2017-07-19 10:02:13' userid='23' />
        </item>
        <invoice>
          <create timestamp='2017-07-19 10:03:37' userid='45' />
        </invoice>
      </audit>
    </audits>
</entity>

Class:

public class Order 
{
    public long id { get; set; }
    public string ordernumber { get; set; }
    public string audits { get; set; }
}   

你可以这样试试

 const string xmlString = @"<columns><column><c1>100</c1><c2>200</c2><cn>300</cn></column><column><c1>111</c1><c2>222</c2><cn>333</cn></column> <column>  <c1>MAX Newsletter</c1><c2>OLS Application</c2>  <cn>Total funded accounts</cn> </column></columns>";
    XDocument doc = XDocument.Parse(xmlString);
    if (doc.Root != null)
    {
        List<Row> items = (from r in doc.Root.Elements("column")
        select new Row
        {
             C1 = (string)r.Element ("C1"),
             C2 = (string)r.Element("C2"),                                           
        }).ToList();

使用属性 XmlTypeXmlAnyElement 修改您的模型(需要 XmlElement 作为类型)

[XmlType("entity")]
public class Order
{
    public long id { get; set; }
    public string ordernumber { get; set; }
    [XmlAnyElement]
    public XmlElement audits { get; set; }
}

允许反序列化完整的 XML 字符串,如

using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
{
    writer.Write(xmlString);
    writer.Flush();
    stream.Position = 0;

    XmlSerializer serializer = new XmlSerializer(typeof(Order));
    Order o = (Order)serializer.Deserialize(stream);
}

现在您可以像

这样的字符串形式获取 audits
string auditsString = o.audits.InnerXml;

您还可以在模型中添加 属性 以简化访问:

public string auditsString
{
    get
    {
        return audits.InnerXml;
    }
}

尝试 xml linq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication68
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Order order = doc.Descendants("entity").Select(x => new Order()
            {
                id = (long)x.Element("id"),
                ordernumber = (string)x.Element("ordernumber"),
                audits = x.Descendants("create").Select(y => (DateTime)y.Attribute("timestamp")).ToList()
            }).FirstOrDefault();
        }
    }
    public class Order
    {
        public long id { get; set; }
        public string ordernumber { get; set; }
        public List<DateTime> audits { get; set; }
    }   

}