Announcement

Collapse
No announcement yet.

DataSet - XML-Export: Zeilen zusammenfassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataSet - XML-Export: Zeilen zusammenfassen

    Hallo zusammen,

    möchte innerhalb einer Rechnungsverwaltung einen Positionsexport in eine XML-Datei verwirklichen. Dazu habe ich mir ein DataSet mit mehreren Tabellen angelegt. Table[1] enthält eine variable Anzahl von Positionen, die jeweils eine Zeile bilden.

    Code:
    private bool Export(Items oItems)
    {
    DataRow oRow = null;
    
    for(int i =0; i < oItems.Count; i++)
    {
    //create new row
    oRow = oDataSet.Tables[1].NewRow();
    oItem = oItems[i];
    //set values for all fields
    oRow["POSITIONS_NUMMER"] = i+1;
    oRow["PSTEUERSATZ"] = oItem.VAT_Percentage.ToString();
    oRow["PMENGE"] = oItem.Quantity.ToString();
    oRow["PBETRAG"] = oItem.Amount.ToString();
    
    //Add the row to the table
    oDataSet.Tables[1].Rows.Add(oRow);
    }
    //accept all changes we made
    oDataSet.Tables[1].AcceptChanges();
    return true;
    }
    Jetzt möchte ich gerne die Positionszeilen beim Export in XML als detail_section zusammenfassen:

    - <detail_section>
    - <POSITION>
    <POSITIONS_NUMMER>1</POSITIONS_NUMMER>
    <PSTEUERSATZ>0</PSTEUERSATZ>
    <PMENGE>1,5</PMENGE>
    <PBETRAG>1,5</PBETRAG>
    </POSITION>
    - </detail_sektion>

    Hat jemand von euch einen Tipp, wie ich die Zeilen zusammenfasse, damit der XML-Text den entsprechenden Container enthält?

    Für ernstgemeinte Codeschnipsel bin ich immer dankbar (mein erstes Posting in diesem Forum).
    Gruß, Eibenschütz

  • #2
    Hallo,

    unter der Voraussetzung von .net 3.5 ist kein Dataset nötig um das Ergebnis zu erzielen.

    Nachfolgendes Bsp. das mit XLINQ arbeitet liefert dieser Ergebnis (aus den Beispieldaten):
    [highlight=xml]
    <Detail-Sektion>
    <Position PositionsNummer="1">
    <Steuersatz>20</Steuersatz>
    <Menge>5</Menge>
    <Betrag>200</Betrag>
    </Position>
    <Position PositionsNummer="2">
    <Steuersatz>10</Steuersatz>
    <Menge>6</Menge>
    <Betrag>18</Betrag>
    </Position>
    </Detail-Sektion>
    [/highlight]

    Dies wurde mit diesem exemplarischen Code erstellt:
    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Xml.Linq;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    // Beispieldaten erzeugen:
    A a = new A();
    a.Items = new List<Item>
    {
    new Item{PositionsNummer = 1, SteuerSatz = 20, Menge = 5, Betrag = 200},
    new Item{PositionsNummer = 2, SteuerSatz = 10, Menge = 6, Betrag = 18}
    };

    // XML erzeugen:
    XElement xml = a.XmlExport(a.Items);

    // XML speichern:
    xml.Save("Test.xml");

    // Testausgabe:
    Console.WriteLine(xml);
    Console.ReadKey();
    }
    }
    //-------------------------------------------------------------------------
    public class A
    {
    public List<Item> Items { get; set; }
    //---------------------------------------------------------------------
    /// <summary>
    /// Erstellt aud den Items ein XML-Fragment
    /// </summary>
    /// <param name="items"></param>
    /// <returns></returns>
    public XElement XmlExport(List<Item> items)
    {
    // XML-Fragment erstellen:
    XElement xml = new XElement("Detail-Sektion");

    // Alle Items durchlaufen:
    foreach (Item item in items)
    {
    // Dem XML-Fragement den Knoten hinzufügen:
    xml.Add(
    new XElement("Position",
    new XAttribute("PositionsNummer", item.PositionsNummer),
    new XElement("Steuersatz", item.SteuerSatz),
    new XElement("Menge", item.Menge),
    new XElement("Betrag", item.Betrag)
    )
    );
    }

    return xml;
    }
    }
    //-------------------------------------------------------------------------
    public class Item
    {
    public int PositionsNummer { get; set; }
    public float SteuerSatz { get; set; }
    public float Menge { get; set; }
    public float Betrag { get; set; }
    }
    }
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo,

      Danke für deine schnelle Antwort. Leider kann ich .net nur in der Version 2.0 voraussetzen. Der System.Xml.Linq Namespace wäre natürlich schon geschmeidig.

      Mit meinem DataSet bin ich ja auch schon fast da, wo ich hin will. Nur die Tabellenstruktur passt noch nicht...
      Gruß, Eibenschütz

      Comment

      Working...
      X