2017-07-25 2 views
0

Lassen Sie mich erklären, gibt es eine Datenbanktabelle, die 1 XML-Spalte mit dem Namen Audits und andere häufige Arten von Spalte hat.Deserialize XML in Klasse mit String-Werten in Xml

so ist es möglich, unter XML in Klasse zu deserialisieren.

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

Klasse:

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

Scheint, dass 'Audits' andere Knoten enthält. Bist du sicher, dass du es als String brauchst? – Fruchtzwerg

+0

Ja ich benutze dies als String, und das ist das Problem :(Aber ich muss dies tun. – user2972061

+0

Sollte nicht Audits sein?: Öffentliche Liste Audits {get; set;} – jdweng

Antwort

1

Ihr Modell ändern mit den Attributen XmlType und XmlAnyElement (erfordert XmlElement als Typ)

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

ermöglicht wie die komplette XML-String deserialisieren

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

Jetzt können Sie wie die audits als String bekommen

string auditsString = o.audits.InnerXml; 

Sie können eine Eigenschaft zu Ihrem Modell hinzufügen, den Zugang zu vereinfachen:

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

Ja, du hast mein Problem gelöst :) Danke, ich habe das als Antwort markiert. – user2972061

+0

können Sie die Antwort auch wissen :) https://stackoverflow.com/questions/45299715/deserialize-xml-to-desire-class – user2972061

0

Sie können wie versuchen, diese

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

Nein, das ist nicht, ich hatte es versucht so viele Dinge, tatsächlich alle die Methode, die ich versucht habe, betrachten meine Audit-XML als verschachtelte XML, aber eigentlich ist es eine Zeichenfolge – user2972061

+0

Bitte verwenden Sie obigen Code – Ravikumar

+0

Also, was ist falsch mit dieser Antwort? Das ist so ziemlich wie ich getan hätte it. –

1

Try 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; } 
    } 

}