反序列化XML成为具有一流的字符串值在XML

问题描述:

让我解释一下,还有有1个XML命名列审计等常见类型列的数据库表。反序列化XML成为具有一流的字符串值在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; } 
} 
+0

似乎'audits'包含其他节点。你确定你需要它作为字符串吗? ? – Fruchtzwerg

+0

是的,我用这个字符串,这就是问题:(但我必须这样做 – user2972061

+0

不该审核是:公开名单审核{获取;集;} – jdweng

与属性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; 
    } 
} 
+0

是的,你解决了我的问题:)谢谢我将此标记为答案。 – user2972061

+0

可能是你知道这个答案,以及:) https://*.com/questions/45299715/deserialize-xml-to-desire-class – user2972061

你可以尝试这样的

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

不,这不是,我只好试着这么多东西,其实所有这一切我已经尝试考虑我的审计XML作为嵌套的XML,但实际上它是字符串。 – user2972061

+0

请使用上面的代码的方法。 – Ravikumar

+0

那么,什么是错的这个答案呢?这是一个很值得我怎么会做它 –

尝试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; } 
    } 

}