Benutzer mit den meisten Antworten
XML Dokumente parsen, abändern, erweitern, Ansätze

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>
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- Als Antwort vorgeschlagen Aleksander Chalabashiev Montag, 2. Mai 2016 08:10
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 5. Mai 2016 10:34
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 -
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
-
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- Als Antwort vorgeschlagen Aleksander Chalabashiev Montag, 2. Mai 2016 08:10
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 5. Mai 2016 10:34