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

时间:2017-07-25 14:20:09

标签: c# asp.net dynamic xml-deserialization

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

因此可以将XML下面的反序列化为类。

<?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>

类别:

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

3 个答案:

答案 0 :(得分:1)

使用属性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;
    }
}

答案 1 :(得分:1)

试试xml linq:

1
2
3
SomeObject

答案 2 :(得分:0)

您可以尝试这样

 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();