Osztály XML-be irása

Osztály XML-be irása
2016-01-27T15:36:26+01:00
2016-01-28T15:34:35+01:00
2022-12-03T05:55:33+01:00
strasszer
Van egy osztályom, ami igy néz ki:

public class Customer { public string SAPCode; public DateTime Date; public List<Product> Products = new List<Product>(); }
A lényeg, hogy az osztály tartalmaz egy listát.
Van egy XML file, amihez ennek az osztálynak egy előfordulását hozzá kellene fűznöm. Az XML file már tartalmaz ugyanilyen strukturájú elemeket, tehát nem létrehozni kell a file-t, hanem megnyitni, és a végére irni az adatot.
Keresgéltem a neten, sok megoldást találtam XMLDocument és XDocument felhasználásával. De ezek a példák mindig fix méretű struktúrával foglalkoznak, pl itt. De az én osztályom mezőszáma nem fix, hiszen akármilyen hosszú is lehet a lista. Gondolom foreach-el kell végigmennem a Product-on, de nem tudom, mihez és hogyan kellene hozzáfűznöm.
Mutasd a teljes hozzászólást!
Melyik része nem megy?
A példakód:

private void addToXml() { XDocument xmlDoc = XDocument.Load("Players.xml"); xmlDoc.Element("Players").Add( new XElement("Player", new XElement("Name", txtName.Text), new XElement("Team", txtTeam.Text), new XElement("Position", cmbPosition.SelectedItem.ToString())) ); xmlDoc.Save("Players.xml"); readXml(); }
A Load meg a Save gondolom világos, a readXml a végén a tágabb értelemben vett példakód része, itt most nem érdekes.
Ami érdekes az az, hogy az XElement-nek vannak konstruktorai meg Add metódusa. Meg akkor már dokumentációja is: XElement Class (System.Xml.Linq)
Tehát
1) létre kéne hoznod egy XElement products=new XElement("Products") elemet,
2) majd valamilyen remek ciklussal hozzáfűzni a product-okat products.Add(new XElement("Product", valamilyenszöveg),
3) majd egy űj customer belsejében hozzáfűzni a dokumentumhoz, kb. xmlDoc.Element("Customers").Add(new XElement("Customer",new XElement("SAPCode",customer.SAPCode),products) - a Date becsomagolását rád bízom - lehet, hogy elég átadni közvetlenül (a konstruktor Object-eket fogad)
A dokumentáció szerint létezik XAttribute osztály is, szóval a SAPCode meg a Date lehetnének attribútumok, ez szerintem egy new XAttribute("SAPCode",customer.SAPCode)-ra történő váltással meg is történik.
Mutasd a teljes hozzászólást!

  • Az XML file már tartalmaz ugyanilyen strukturájú elemeket, tehát nem létrehozni kell a file-t, hanem megnyitni, és a végére irni az adatot.

    Az XML nem bővíthető, be kell olvasni, és újra kell írni. Amúgy pedig a hivatkozott példát nézd meg jobban: pont mutat listát, Players a neve, és röptében fűz hozzá Player-eket. addToXml metódus, alulról a második blokk: betölti a file-t, hozzáfűz, kiír. Pontosan erre van neked is szükséged.
    Mutasd a teljes hozzászólást!
  • Az XML-ben van egy Customers lista, aminek egy tagja egy Customer, ezt fel is tudom venni a kód, dátum elementekkel. A problémám az, hogya tudom a Product listát hozzáadni a Customer Element-hez. Gondolom, először össze kellene állitanom a Products listát, majd azt hozzáadni a Customerhez. Ez nem megy...
    Mutasd a teljes hozzászólást!
  • Melyik része nem megy?
    A példakód:

    private void addToXml() { XDocument xmlDoc = XDocument.Load("Players.xml"); xmlDoc.Element("Players").Add( new XElement("Player", new XElement("Name", txtName.Text), new XElement("Team", txtTeam.Text), new XElement("Position", cmbPosition.SelectedItem.ToString())) ); xmlDoc.Save("Players.xml"); readXml(); }
    A Load meg a Save gondolom világos, a readXml a végén a tágabb értelemben vett példakód része, itt most nem érdekes.
    Ami érdekes az az, hogy az XElement-nek vannak konstruktorai meg Add metódusa. Meg akkor már dokumentációja is: XElement Class (System.Xml.Linq)
    Tehát
    1) létre kéne hoznod egy XElement products=new XElement("Products") elemet,
    2) majd valamilyen remek ciklussal hozzáfűzni a product-okat products.Add(new XElement("Product", valamilyenszöveg),
    3) majd egy űj customer belsejében hozzáfűzni a dokumentumhoz, kb. xmlDoc.Element("Customers").Add(new XElement("Customer",new XElement("SAPCode",customer.SAPCode),products) - a Date becsomagolását rád bízom - lehet, hogy elég átadni közvetlenül (a konstruktor Object-eket fogad)
    A dokumentáció szerint létezik XAttribute osztály is, szóval a SAPCode meg a Date lehetnének attribútumok, ez szerintem egy new XAttribute("SAPCode",customer.SAPCode)-ra történő váltással meg is történik.
    Mutasd a teljes hozzászólást!
  • Köszönöm a részletes leirást. Eddig nem nagyon értettem ezt az XML-dolgot C#-ban, csak használtam. Igy ahogy beleléptem egy komolyabba, már el is szálltam.

    De most már értem, sikerült is megcsinálnom.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd