none
XML Dokumente parsen, abändern, erweitern, Ansätze RRS feed

  • Frage

  • Hallo,

    vermutlich stolpere ich über die Serialisierung, zeitliches Problem.
    Ich benötige nahezu Echtzeit.
    Das benötigt Zeit usw.

     using (var reader = XDoc.CreateReader())
                    {
    Die Alternative wäre das XML Dokument zu parsen.
    Das Ziel:
    Ich bekomme ein Eingangs XML, als string.
    Dieses muss ich auswerten, und teils modifizieren und wieder zurücksenden.
    Dabei ist der Eingang nahezu gleich mit dem Ausgang.
    Es kommen ein paar Knoten, Elemente hinzu oder andere Attribute.
    Was würde sich hier eignen?
       XDocument? LinQ?
       Wie lese ich am besten ein, erweitere, modifiziere.
       Evtl. zunächst ein Klon oder eine Kopie machen, etc.

    Vermutlich wird das schneller sein.
    Gibt es evtl. eine unabhängige Seite bezgl. Zeitverhalten.
        C++ zu C#

    z.B. auch Thread, BlockingCollection Queue etc.   Ist C# evtl. von Haus aus langsamer, ja oder nein?

    Das wäre super, da ich mich bezgl. Zeit rechtfertigen muss.

    Fakt ist, parsen C++, alte Applikation ist schneller, jetzt habe ich ein Problem und bin in Beweisnot.

    Danke für Tipps für die 2 Punkte.

    Viele Grüße Sandra

    Beispiel:

    Eingang:
    -----------------------------------------------------------------------------------------------

    <?xml version="1.0"?>
    <BestellungEingang bestelldatum="2016-04-26">
        <Lieferadresse land="DE">
            <Name>Alice Schmid</Name>
            <Straße>Walnussgasse 42</Straße>
            <Ort>Frankfurt/Main</Ort>
            <PLZ>60000</PLZ>
        </Lieferadresse>
        <Rechnungsadresse land="DE">
            <Name>Robert Schmid</Name>
            <Straße>Haselnussweg 3</Straße>
            <Ort>Frankfurt/Main</Ort>
            <PLZ>61240</PLZ>
        </Rechnungsadresse>
        <Kommentar>Bitte mit Geschenkverpackung!</Kommentar>
        <Waren>
            <Buch ISBN="3776622148">
            <Titel> Lebensenergie richtig einteilen.</Titel>
            <Anzahl>1</Anzahl>
            <PreisEUR>29.90</PreisEUR>
            <Kommentar>Bitte Liefertermin bis Weihnachten bestätigen.</Kommentar>
            </Buch>
            <Buch ISBN="3551551677">
            <Titel>Harry Potter und der Stein der Weisen</Titel>
            <Anzahl>1</Anzahl>
            <PreisEUR>29.90</PreisEUR>
            <Lieferdatum>2000-01-04</Lieferdatum>
            </Buch>
        </Waren>
    </BestellungEingang>
    -------------------------------------------------------
    Ausgang:
    
    <?xml version="1.0"?>
    <BestellungAusgang versandatum="2016-04-27">
        <Lieferadresse land="DE">
            <Name>Alice Schmid</Name>
            <Straße>Walnussgasse 42</Straße>
            <Ort>Frankfurt/Main</Ort>
            <PLZ>60000</PLZ>
        </Lieferadresse>
        <Rechnungsadresse land="DE">
            <Name>Robert Schmid</Name>
            <Straße>Haselnussweg 3</Straße>
            <Ort>Frankfurt/Main</Ort>
            <PLZ>61240</PLZ>
        </Rechnungsadresse>
        <Kommentar>Geschenkverpackung korrekt vorgenommen</Kommentar>
        <Waren>
            <Buch ISBN="3776622148">
            <Titel> Lebensenergie richtig einteilen.</Titel>
            <Anzahl>1</Anzahl>
            <PreisEUR>29.90</PreisEUR>
            <Kommentar>Liefertermin bis 30.04.2016 bestätigt.</Kommentar>
            </Buch>
            <Buch ISBN="3551551677">
            <Titel>Harry Potter und der Stein der Weisen</Titel>
            <Anzahl>1</Anzahl>
            <PreisEUR>29.90</PreisEUR>
            <Lieferdatum>2016-05-01</Lieferdatum>
            </Buch>
        </Waren>
    	<MONAT_ARPIL>
          <POSITIONS>
            <POSITION number="1" active="1" />
            <POSITION number="2" active="0" />
            <POSITION number="3" active="1" />
            <POSITION number="4" active="1" />
            <POSITION number="5" active="1" />
            <POSITION number="50" active="1" />
          </POSITIONS>
        </MONAT_ARPIL>
    </BestellungAusgang>


    Mittwoch, 27. April 2016 16:46

Antworten

  • Hi Sandra,
    wie ich Dir schon geschrieben habe, ist das Serialisieren und Deserialisieren nicht zeitkritisch, wenn die dafür benötigten Objekte vorliegen. Wenn also immer der gleiche Typ zu serialisieren/deserialisieren ist, dann kannst Du die gleiche Instanz des Serializers nutzen.

    Für "...das XML Dokument zu parsen" gibt es verschiedene Möglichkeiten. Unterschiedliche Realisierungen erzeugen auch unterschiedliche Zeiten. Vermutungen, ob eine Variante schneller ist als eine andere, kann man nur mit Messungen widerlegen. Gleiche Realisierungen in C++, C#.NET oder VB.NET benötigen auch die gleiche Zeit. C++ ermöglicht den direkten Zugriff auf den Speicher und damit z.B. die Ausnutzung von Techniken zur Adressrechnung, die u.U. schneller sein können als ein analoge Funktionalität, die in C#.NET oder VB.NET programmiert wurde. Andererseits kann mit der Programmierung in C#.NET oder VB.NET eine höhere Produktivität sowohl in der Programmierung als auch im Test erreicht werden. Die von den C#- und VB-Compilern angewandte Optimierung des Kompilats erzeugt Code, der sich in der Ausführung wie mit C++ erzeugter Code verhalten kann.

    Wenn es nur um das Anhängen von XML-Knoten an einer bestimmten Stelle in einer Zeichenkette geht, dann kann man sich das Serialisieren und Deserialisieren der gesamten Zeichenkette sparen. Das macht vermutlich das C++-Programm und ist damit schneller als die Nutzung eines Serialize-Objektes.

    Um eine Testlösung zu bewerten, müsste Du aber genauer die Umgebungsanforderungen beschreiben (wie viele Objekte, wie lang sind die Zeichenketten, wie häufig ist zu serialisieren usw.).


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Donnerstag, 28. April 2016 12:38

Alle Antworten

  • Hallo Sandra,

    poste doch bitte mal ein komplettes Beispielprojekt inkl. der verwendeten Datenklassen, deinem Serialisierer, ... mit dem man das Performanceproblem nachvollziehen kann. So ist es für uns einfacher, selbst zu messen, Anpassungen vorzunehmen, usw.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 27. April 2016 17:15
    Moderator
  • Hallo Sandra,

    es gibt umfangreiche Möglichkeiten zur Performance Analyse, diese könnten in deinem Fall Hilfreich sein. Sieh Dir doch mal die Einführung in die Leistungsprofilerstellung an.

    Mein erster Gedanke war eine Transformation mit XSL, aber ich bin dann nach dem Beispiel nicht sicher ob das die optimale Lösung wäre - eventuell lohnt es sich aber drüber Nachzudenken.

    Gruß


    - Florian

    Donnerstag, 28. April 2016 07:50
  • Hi Sandra,
    wie ich Dir schon geschrieben habe, ist das Serialisieren und Deserialisieren nicht zeitkritisch, wenn die dafür benötigten Objekte vorliegen. Wenn also immer der gleiche Typ zu serialisieren/deserialisieren ist, dann kannst Du die gleiche Instanz des Serializers nutzen.

    Für "...das XML Dokument zu parsen" gibt es verschiedene Möglichkeiten. Unterschiedliche Realisierungen erzeugen auch unterschiedliche Zeiten. Vermutungen, ob eine Variante schneller ist als eine andere, kann man nur mit Messungen widerlegen. Gleiche Realisierungen in C++, C#.NET oder VB.NET benötigen auch die gleiche Zeit. C++ ermöglicht den direkten Zugriff auf den Speicher und damit z.B. die Ausnutzung von Techniken zur Adressrechnung, die u.U. schneller sein können als ein analoge Funktionalität, die in C#.NET oder VB.NET programmiert wurde. Andererseits kann mit der Programmierung in C#.NET oder VB.NET eine höhere Produktivität sowohl in der Programmierung als auch im Test erreicht werden. Die von den C#- und VB-Compilern angewandte Optimierung des Kompilats erzeugt Code, der sich in der Ausführung wie mit C++ erzeugter Code verhalten kann.

    Wenn es nur um das Anhängen von XML-Knoten an einer bestimmten Stelle in einer Zeichenkette geht, dann kann man sich das Serialisieren und Deserialisieren der gesamten Zeichenkette sparen. Das macht vermutlich das C++-Programm und ist damit schneller als die Nutzung eines Serialize-Objektes.

    Um eine Testlösung zu bewerten, müsste Du aber genauer die Umgebungsanforderungen beschreiben (wie viele Objekte, wie lang sind die Zeichenketten, wie häufig ist zu serialisieren usw.).


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Donnerstag, 28. April 2016 12:38