2016-12-05 3 views
0

Ich habe eine Sammlung Zeichenfolge mit Informationen über Kunden wie Name, Geschlecht usw. Alle Kunden haben eine ID.Erstellen XML-Datei aus Sammelliste

Jetzt möchte ich eine gemeinsame XML-Datei mit allen Kunden darin erstellen. So etwas wie Beispiel unten:

<custumers> 
    <custumer> 
     <name></name> 
     <id></id> 
     <etc></etc> 
    </custumer> 
</custumers> 

Der Start ohne XML-Datei ist einfach, habe ich Linq die XML-Datei zu erstellen.

Für erstmalige Erstellung verwendete ich folgenden Code:

try 
{ 
    var xEle = new XElement("Customers", 
    from cus in cusList 
     select new XElement("Customer", 
      new XElement("Name", cus.Name), 
      new XElement("gender", cus.gender), 
      new XElement("etc", cus.etc)); 
} 
xEle.Save(path); 

Aber auf den Punkt, wenn ich die XML-Datei aktualisieren möchten, bekomme ich einige Probleme, es zu bekommen. Mein Ansatz, es zu lösen:

Iterate over all customers in list and check for all customers if the customer.id exists in the XML. 
IF not: add new customer to xml 
IF yes: update values 

Mein Code so weit:

var xEle = XDocument.Load(xmlfile); 
foreach (cus in cusList) 
try 
{ 
    var cids = from cid in xEle.Descendants("ID") 
       where Int32.Parse(xid.Element("ID").Value) == cus.ID   
       select new XElement("customer", cus.name), 
        new XElement ("gender"), cus.gender), 
        new XELement ("etc."), cus.etc) 

     ); 
     xEle.Save(xmlpath); 
} 
+1

Sie möchten XML aktualisieren? Warum kannst du es nicht einfach umschreiben? – Prajwal

+0

Wenn ich es neu schreiben möchte, muss ich alle Daten aus dem vorhandenen XML laden. Ich denke nicht, dass dies eine performante Lösung ist. Oder ich liege falsch? – swtch3k

+1

Überprüfung jeder ID kostet mehr CPU-Zeit. wird nicht es? – Prajwal

Antwort

0

Wie über einen anderen Ansatz ....

using System.IO; 
using System.Text; 
using System.Xml.Serialization; 

public void Main() 
{ 
    DataSet Custumers = new DataSet("Custumers"); 
    DataTable Custumer = new DataTable("Custumer"); 

    // Create the columns 
    Custumer.Columns.Add("id", typeof(int)).Unique = true; 
    Custumer.Columns.Add("name", typeof(string)); 
    Custumer.Columns.Add("gender", typeof(string)); 
    Custumer.Columns.Add("etc", typeof(string)); 

    // Set the primary key 
    Custumer.PrimaryKey = { Custumer.Columns("id") }; 

    // Add table to dataset 
    Custumers.Tables.Add(Custumer); 
    Custumers.AcceptChanges(); 

    // Add a couple of rows 
    Custumer.Rows.Add(1, "John", "male", "whatever"); 
    Custumer.Rows.Add(2, "Jane", "female", "whatever"); 
    Custumer.AcceptChanges(); 

    // Let's save this to compare to the updated version 
    Custumers.WriteXml("Custumers_Original.xml"); 

    // Read in XML that contains an existing Custumer and adds a new one 
    // into a Clone of the Custumer table 
    DataTable CustumerUpdate = Custumer.Clone; 
    CustumerUpdate.ReadXml("Custumers_Update.xml"); 

    // Merge the clone table data to the Custumer table 
    Custumer.Merge(CustumerUpdate); 
    Custumer.AcceptChanges(); 

    Custumers.WriteXml("Custumers_Final.xml"); 
} 

Custumers_Original.xml wie folgt aussieht:

<?xml version="1.0" standalone="yes"?> 
<Custumers> 
    <Custumer> 
     <id>1</id> 
     <name>John</name> 
     <gender>male</gender> 
     <etc>whatever</etc> 
    </Custumer> 
    <Custumer> 
     <id>2</id> 
     <name>Jane</name> 
     <gender>female</gender> 
     <etc>whatever</etc> 
    </Custumer> 
</Custumers> 

C ustumers_Update.xml dies hat, eine Änderung John machen und das Hinzufügen von George:

<?xml version="1.0" encoding="utf-8" ?> 
<Custumers> 
    <Custumer> 
     <name>John</name> 
     <id>1</id> 
     <gender>male</gender> 
     <etc>this is new</etc> 
    </Custumer> 
    <Custumer> 
     <name>George</name> 
     <id>3</id> 
     <gender>male</gender> 
     <etc>grandson</etc> 
    </Custumer> 
</Custumers> 

Nach der Zusammenführung enthält die Custumers_Final.xml dies:

<?xml version="1.0" standalone="yes"?> 
<Custumers> 
    <Custumer> 
     <id>1</id> 
     <name>John</name> 
     <gender>male</gender> 
     <etc>this is new</etc> 
    </Custumer> 
    <Custumer> 
     <id>2</id> 
     <name>Jane</name> 
     <gender>female</gender> 
     <etc>whatever</etc> 
    </Custumer> 
    <Custumer> 
     <id>3</id> 
     <name>George</name> 
     <gender>male</gender> 
     <etc>grandson</etc> 
    </Custumer> 
</Custumers> 
+0

Schöne Annäherung, danke! Ich löse es auch mit linq. Ich werde prüfen, welche Leistung besser ist und mehr Sicherheit ist. – swtch3k

+0

Eine Sache, die Sie uns nie gesagt haben, war, wo die neuen Kundendaten herkommen würden ... das würde einen Unterschied machen. – MrGadget

0

Auch meine Lösung mit Linq:

try 
    { 
     XDocument xEle = XDocument.Load(path); 
     var ids = from id in xEle.Descendants("Custom") 
     where id.Element("id").Value == cus.ID 
     select id; 

     foreach (XElement idCustom in ids) 
     { 
     idCustom.SetElementValue("NewName", "NewElement"); 
     } 
     xEle.Save(path); 
     } 
+0

Dies kann Ihre Update-Anforderung erfüllen, fügt aber keine neuen Datensätze hinzu ... nur zu sagen. – MrGadget