none
XML parsen RRS feed

  • Frage

  • Hallo,

    ich verwende den XMLReader, alles bestens, bis auf

    Ende, ist schlecht

    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

    Dienstag, 9. August 2016 17:58

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
    Samstag, 13. August 2016 07:36
    Beantworter

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

    Mittwoch, 10. August 2016 06:20
    Beantworter
  • Hallo Elmar,
    oder eben über XML Document.
    Die Frage dann halt, welcher Reader ist schneller.
    Gibt es evtl. eine Übersicht wann was nehmen?
    XML, HTML parsen kommt ja immer wieder
    Viele Grüße Ulrich
    Mittwoch, 10. August 2016 18:14
  • 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

    Mittwoch, 10. August 2016 18:25
    Beantworter
  • Hallo Elmar,

    ok, wenn's schnell gehen muss, dann ist der XMLReader die richtige Wahl.

    Das habe ich noch gefunden

    Nichtsdestotrotz, kann Du mir mitteilen, wie Du erkennen kannst, dass die XMLDocument auf den XMLReader aussetzt?
    SelectSingleNode wäre ja die Alternative zu ReadToFollowing
    Viele Grüße Ulrich
    namespace 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();


    Freitag, 12. August 2016 15:49
  • 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
    Samstag, 13. August 2016 07:36
    Beantworter