Benutzer mit den meisten Antworten
XML parsen

Frage
-
Hallo,
ich verwende den XMLReader, alles bestens, bis auf
ReadToFollowing, ist super nur wenn das Element nicht da ist.
Was kann ich dagegen tun? Wenn das Element nicht da ist, ok, dann soll es aber mit dem nächsten Element weitergehen oder ich eine Stufe zurück.
Wer weiß Rat?
Viele Grüße Ulrich
Antworten
-
Hallo Ulrich,
was die Verwendung eines XmlReaders für das Einlesen angeht, schau Dir die Überladen von XmlDocument.Load an und auch deren Überladungen kapseln die Streams etc. in einen Xml(Text)Reader; gleiches gilt für XDocument.Load. Willst Du Genaueres wissen schau Dir den Reference Source an ;)
Sicher könnte man SelectSingleNode verwenden, aber ehrlich gesagt ist das IMO deutlich mühsamer als Xml Linq Descendants, da man den Path genauer kennen muss.
Da Du anscheinend wenig davon verstehst - Deine Fundstelle sind nun wirklich Basics - mag dir das angenehmer sein. Linq ist wiederum besser dokumentiert und mit reichlich Beispielen in der Code Gallery vertreten.
Gruß Elmar
- Als Antwort markiert Ulrich Stippe Samstag, 13. August 2016 10:31
Alle Antworten
-
Hallo Ulrich,
dann ist die Methode schlicht und einfach unpassend. Wird nichts gefunden steht der XmlReader am Ende der Datei und da man immer nur vorwärts lesen kann, müsstest Du die Datei erneut öffnen und einen weiteren Versuch starten; was am Ende womöglich eine Menge Zeit kostet.
Sinnvoller ist in solchen Fällen die Datei zu durchlaufen und sich die gesuchten Elemente zu merken, so dass man den besten Treffer auswählen kann.
Ist die Datei nicht sehr groß sollte man eher Linq To Xml verwenden und die Datei komplett einlesen. Dann kann man über Methoden wie Descendants zurückgreifen, siehe dazu: How to: Filter on Element Names (LINQ to XML) (C#).
Gruß Elmar
-
Hallo,
XDocument bietet IMO ein komfortableres Arbeiten, als das auf W3C DOM angelehnte XMLDocument, das an mancher Stelle overdesigned ist und einiges an Komfort im Vergleich zu Linq To Xml vermissen lässt, wie z. B. direkte Unterstützung von .NET Datentypen.
Zum Einlesen nutzen beide den XmlReader, insofern gibt es dort keinen Unterschied.
Gruß Elmar
-
Hallo Elmar,
ok, wenn's schnell gehen muss, dann ist der XMLReader die richtige Wahl.
Nichtsdestotrotz, kann Du mir mitteilen, wie Du erkennen kannst, dass die XMLDocument auf den XMLReader aussetzt?SelectSingleNode wäre ja die Alternative zu ReadToFollowingViele Grüße Ulrichnamespace System.Xml { // Zusammenfassung: // Stellt einen einzelnen Knoten im XML-Dokument dar. [DebuggerDisplay("{debuggerDisplayProxy}")] public abstract class XmlNode : ICloneable, IEnumerable, IXPathNavigable { public virtual XmlNodeList ChildNodes { get; } // // Zusammenfassung: public XmlNode SelectSingleNode(string xpath); namespace System.Xml { // Zusammenfassung: // Stellt ein XML-Dokument dar. public class XmlDocument : XmlNode { // Zusammenfassung: // Die zu verwendende XmlImplementation. protected internal XmlDocument(XmlImplementation imp); namespace System.Xml { // Zusammenfassung: // Stellt einen Reader dar, der schnellen, nicht zwischengespeicherten Vorwärtszugriff // auf XML-Daten bietet. [DebuggerDisplay("{debuggerDisplayProxy}")] public abstract class XmlReader : IDisposable { // Zusammenfassung: // Initialisiert eine neue Instanz der XmlReader-Klasse. [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] protected XmlReader();
- Bearbeitet Ulrich Stippe Freitag, 12. August 2016 15:49 Format
-
Hallo Ulrich,
was die Verwendung eines XmlReaders für das Einlesen angeht, schau Dir die Überladen von XmlDocument.Load an und auch deren Überladungen kapseln die Streams etc. in einen Xml(Text)Reader; gleiches gilt für XDocument.Load. Willst Du Genaueres wissen schau Dir den Reference Source an ;)
Sicher könnte man SelectSingleNode verwenden, aber ehrlich gesagt ist das IMO deutlich mühsamer als Xml Linq Descendants, da man den Path genauer kennen muss.
Da Du anscheinend wenig davon verstehst - Deine Fundstelle sind nun wirklich Basics - mag dir das angenehmer sein. Linq ist wiederum besser dokumentiert und mit reichlich Beispielen in der Code Gallery vertreten.
Gruß Elmar
- Als Antwort markiert Ulrich Stippe Samstag, 13. August 2016 10:31