2017-07-18 6 views
0

Ich versuche, eine XML-Datei mit den Daten in meiner DataTable zu erstellen. Letztlich ist es das, was ichZeigen Sie die Datentabelle in xml an C#

<?xml version="1.0" encoding="utf-8"?> 
<regisApts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <JobList> 
    <Job id="1245"> 
     <Date>2010-07-25</Date> 
     <Reason>No Access 1</Reason> 
     <Comment>Tenant is on holiday</Comment> 
     <ExternalJobNumber>123456</ExternalJobNumber> 
    </Job> 
    <Job id=""> 
     <Date>2010-07-26</Date> 
     <Reason>No Access 2</Reason> 
     <Comment>Tenant out at work</Comment> 
     <ExternalJobNumber>123456</ExternalJobNumber> 
    </Job> 
    <Job id="1453"> 
     <Date>2010-07-25</Date> 
     <Reason>No Access 1</Reason> 
     <Comment>Tenant in hospital</Comment> 
    </Job> 
    </JobList> 
</regisApts> 

ich eine xml mit foreach generieren verwaltet erstellen wollen, aber es ist overiding die XML, wenn die nächste Zeile eingefügt wird. Jede Hilfe wird wirklich geschätzt. Dank

foreach (DataRow row in dt.Rows) 
{ 
    xmlCostCode = row["CostCode"].ToString(); 
    xmlReason = row["Reason"].ToString(); 
    xmlComment = row["PropertyCode"].ToString(); 
    xmlFilePath = xmlFolderPath + "test" + ".xml"; 

    xmlContent = "<JobList><Job Id=\"" + xmlCostCode + "\"><Date>2017-07-18</Date><Reason>" + xmlReason + "</Reason><Comment>" + xmlComment + "</Comment></Job></JobList>"; 

    XmlDocument xdoc = new XmlDocument(); 
    xdoc.LoadXml(xmlContent); 
    xdoc.Save(xmlFilePath); 
} 

Ergebnisse ich

<JobList> 
    <Job id="1245"> 
     <Date>2010-07-25</Date> 
     <Reason>No Access 1</Reason> 
     <Comment>Tenant is on holiday</Comment> 
     <ExternalJobNumber>123456</ExternalJobNumber> 
    </Job> 
<JobList> 
+0

Welche Ergebnisse erhalten Sie? –

+0

@RobertJuneau Ich habe die Frage bearbeitet und die Ergebnisse hinzugefügt – KMR

+1

Warum verwenden Sie eine DataTable an erster Stelle? Warum nicht ein stark typisiertes Objekt wie 'List '? – mason

Antwort

1

Jedes Mal, wenn Sie tun

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(xmlContent); 
xdoc.Save(xmlFilePath); 

Er schreibt über Ihr vorheriges Dokument mit der neuesten Reihe, versucht so

xmlContent = "<regisApts xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><JobList>"; 
foreach (DataRow row in dt.Rows) 
{ 
    xmlCostCode = row["CostCode"].ToString(); 
    xmlReason = row["Reason"].ToString(); 
    xmlComment = row["PropertyCode"].ToString(); 
    xmlFilePath = xmlFolderPath + "test" + ".xml"; 

    xmlContent = xmlContent +"<Job Id=\"" + xmlCostCode + "\"><Date>2017-07-18</Date><Reason>" + xmlReason + "</Reason><Comment>" + xmlComment + "</Comment></Job>"; 

} 
xmlContent = xmlContent +"</JobList></regisApts>"; 
XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(xmlContent); 
xdoc.Save(xmlFilePath); 

Auf diese Weise erstellen Sie die Zeichenfolge mit jeder Zeile und sobald dies erledigt ist, erstellen Sie das XML-Dokument.

+2

Abhängig davon, wie viele Zeilen in der DataTable sind, ist es möglicherweise sicherer, einen StringBuilder zu verwenden. Wenn Sie den XML-Text manuell generieren, können Sie auch einfach die übrigen öffnenden und schließenden Tags an den StringBuilder anhängen und mit einem StreamWriter in die Datei schreiben. – Marc

+0

Dies funktioniert nicht für mich, ich bekomme unerwartet schließenden Tag Fehler – KMR

+0

@KMR was ist das fehlerhafte schließende Tag? –

1

Wenn Sie sagen, Sie verwenden for ... each, Ich gehe davon aus Sie bauen die XML textlich auf. Ich empfehle, dass Sie nicht tun, und stattdessen in XML-Serialisierung suchen. Microsoft stellt ein Beispiel hier:

https://support.microsoft.com/en-us/help/815813/how-to-serialize-an-object-to-xml-by-using-visual-c

Im Wesentlichen Sie eine Objektdarstellung für Ihre XML erstellen (Ihre Datentabelle wahrscheinlich, dass diese ohnehin schon ist), einen Serializer für Ihre Art zu erstellen, und führen Sie es dann, um eine Ausgabe von Strom (Datei-Stream, etc.)

0

Mit xml linq

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

namespace ConsoleApplication65 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("CostCode", typeof(int)); 
      dt.Columns.Add("Date", typeof(DateTime)); 
      dt.Columns.Add("Reason", typeof(string)); 
      dt.Columns.Add("Comment", typeof(string)); 
      dt.Columns.Add("PropertyCode", typeof(int)); 

      dt.Rows.Add(new object[] { 1245, DateTime.Parse("2010-07-25"), "No Access 1", "Tenant is on holiday", 123456 }); 
      dt.Rows.Add(new object[] { null, DateTime.Parse("2010-07-26"), "No Access 2", "Tenant out at work", 123456 }); 
      dt.Rows.Add(new object[] { 1453, DateTime.Parse("2010-07-25"), "No Access 1", "Tenant in hospital", null }); 

      string header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
       "<regisApts xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + 
       "<JobList></JobList></regisApts>"; 

      XDocument doc = XDocument.Parse(header); 
      XElement jobList = doc.Descendants("JobList").FirstOrDefault(); 

      foreach(DataRow row in dt.AsEnumerable()) 
      { 
       XElement job = new XElement("Job", new object[] { 
        new XAttribute("id", row.Field<object>("CostCode") == null ? "" : row.Field<int>("CostCode").ToString()), 
        new XElement("Date", row.Field<DateTime>("Date").ToString("yyyy-MM-dd")), 
        new XElement("Reason", row.Field<string>("Reason")), 
        new XElement("Comment", row.Field<string>("Comment")), 
        new XElement("ExternalJobNumber", row.Field<object>("PropertyCode") == null ? "" : row.Field<int>("PropertyCode").ToString()) 
       }); 
       jobList.Add(job); 
      } 
     } 
    } 

} 
0

Sofern Sie eine Datatable aus irgendeinem Grunde verwenden (Ich habe keine guten hier sehen), dann sollten Sie Generics verwenden, um Ihre Daten als stark typisierte Objekt zurückgeben. Etwas wie

Verwenden Sie dann eine Funktion, um Ihre JobList-Klasse in XML zu serialisieren. Übergeben Sie einfach Ihre Klasse als Objekt an die Funktion. Ich bevorzuge es, die XMLSerializer-Klasse nicht zu verwenden, da sie aufgebläht ist und eine temporäre Datei erstellen muss, während ich das Objekt serialisieren muss. Ich würde so etwas verwenden, das wesentlich schneller ist.

public XElement GetAsXml(object obj) 
    { 
     XElement xelement = new XElement(obj.GetType().Name); 

     PropertyInfo[] props = obj.GetType().GetProperties(); 

     foreach (PropertyInfo prop in props) 
     { 
      object propertyValue = prop.GetValue(obj); 

      if(propertyValue != null) 
      { 
       XElement xProperty = new XElement(prop.Name, propertyValue); 
       xelement.Add(xProperty); 
      } 
     } 

     return xelement; 
    } 
Verwandte Themen