XML mit Read() durchlaufen dauert lange, wieso?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von dusti.

    XML mit Read() durchlaufen dauert lange, wieso?

    Hi,

    Ich bin neu hier, also erstmal ein Hallo :D

    Ich schreib gerade ein kleines Tool, das eine XHTML Seite einliesst und das ganze wieder in XML schreiben soll, allerdings nur die Daten, also z.B. keine <div> oder so, die zu HTML gehören. Es funktioniert eigentlich auch alles. Die Daten werden eingelesen und im Moment zwar erst noch über MsgBox() ausgegeben. Das Speichern mach ich erst später. Mein Problem ist, dass jedesmal, wenn ich Anfange, die XHTML-Datei zu lesen, das gesammte Programm für ca 1min einfach nicht reagiert. Danach kommen die Daten dann aber wieder flüssig. Woran könnte das liegen?

    Ich weiss nicht, ob das an meinem Code liegt oder nicht, also poste ich ihn mal:

    VB.NET-Quellcode

    1. Dim File As String
    2. Dim oxml As System.IO.StreamReader
    3. Dim XML As System.Xml.XmlTextReader
    4. Dim beginnparse As Boolean
    5. For Each File In System.IO.Directory.GetFiles(Me.TextBox1.Text)
    6. If File.EndsWith(".xhtml") Then 'Iteriert durch alle Files in den Ordner
    7. Try
    8. oxml = New System.IO.StreamReader(File)
    9. XML = New System.Xml.XmlTextReader(oxml)
    10. beginnparse = False
    11. XML.WhitespaceHandling = System.Xml.WhitespaceHandling.None
    12. Do While XML.Read()
    13. If (XML.NodeType = System.Xml.XmlNodeType.Text) Then
    14. If XML.Value = "Spieler:" Then
    15. beginnparse = True
    16. End If
    17. If XML.Value = "-- Zu PC wechseln --" Then
    18. beginnparse = False
    19. End If
    20. If beginnparse = True Then
    21. MsgBox(XML.Value)
    22. End If
    23. End If
    24. Loop
    25. Catch ex As Exception
    26. MsgBox(ex.Message)
    27. End Try
    28. End If
    29. Next


    Ausgegeben werden nur Text. Also dass, was der User sieht, wenn er die Seite im Browser anschaut. Da mich nicht alles interressiert, fange ich mit dem eigentlichen Zuweisen erst an, nachdem XML der WErt "Spieler:" hat, da mich nur die Daten danach interessieren.

    Ich hoffe, es ist verständlich, was ich meine. Falls mir jemand helfen kann, wäre ich sehr dankbar. Sollte etwas unklar sein ->fragen, ich antworte :))

    MfG dusti
    Hi!

    Es gibt einen Lese-Modus, mit den man XML-Dateien nur in eine Richtung abarbeiten kann. Da du sowieso nur While xml.Reading() machst, sollte das kein Problem darstellen.

    Ansonsten: der (managed) MS-XML-Parser 8 ist ein "bisschen" überladen mit Methoden und Aufrufen, die das ganze etwas langsamer gestallten...


    PS:
    Wie groß ist denn die XML-Datei?


    so long..
    Andy
    Ich finde das, was ich gemeint hab irgendwie nicht mehr in der MSDN Oo

    Ich hab (früher) die XML-Dateien immer so ausgelesen, kann mir aber beim besten willen nicht vostellen, dsas das schneller geht:

    VB.NET-Quellcode

    1. Dim xmldoc As New XmlDocument()
    2. xmldoc.Load(AppPath & "\myFile.xml")
    3. Dim MainNode As XmlNode = xmldoc.ChildNodes.Item(0) 'jede xml-datei hat EINEN Hauptknoten
    4. if xmldoc.HasChildNodes then
    5. For Each node As XmlNode In MainNode.ChildNodes
    6. 'hier node abfragen, evntl. rekursiver aufruf
    7. Next node
    8. End If



    Der Vorteil vom XMLDocument ist eigentlich, dass man gezielt auf Datensätze zugreifen kann, ohne alles mit Ifs vollzustopfen.
    z.B.: XML->Programm1->Einstellung1->Attribut:Wert


    so long..
    Andy

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    Stimmt, diesen Ansatz verfolge ich auch an anderer Stelle.
    Ich habe jetzt herausgefunden, woran es eventuell liegen könnte. Und zwar kommt, wenn ich nicht mit dem Internet verbunden bin, eine Webecxeption. Wieso das Programm überhaupt versucht, das aufzulösen ist mir völlig unklar. Ich versuche weder, die Seite zu öffnen, noch versuche ich sonstwie mit dem Programm ins Internet zu kommen. Der Code, der die Fehlermeldung auslöst ist folgender:

    VB.NET-Quellcode

    1. Dim xml As Xml.XmlDocument = New Xml.XmlDocument()
    2. xml.Load(Me.TextBox1.Text & "\pc3.xhtml")
    3. Dim root As Xml.XmlNode = xml.DocumentElement
    4. CrossNodes(root)


    Verantwortlich ist die Zeile "xml.Load(Me.TextBox1.Text & "\pc3.xhtml")"
    In der XHTML-Datei sind sehr warscheinlich folgende Zeile schuld:

    HTML-Quellcode

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">


    Aber da es sich um XHTML handelt, hat es ja auch noch andere Links drin,bei denen ncith versucht wird, sie aufzulösen. Ich versteh wirklich nciht mehr wieso 8o
    Argh, ich bin am verzweifeln ;(

    Ich hab jetzt versucht, die Zeilen

    HTML-Quellcode

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">


    manuell zu löschen. Es funktioniert aber nicht. Was mich aber wundert ist, wieso keine Variable implementiert wurde, mit der man ganz einfach angeben kann, ob man im Internet nach der DTD-Datei suchen lassen soll. Kann mir jemand einen Tipp geben, wie ich das Problem, dass das Programm dauernd versucht die DTD-Datei zu laden, umgehen kann?
    Ich habs jetzt hingekriegt. Ich hab aus versehen

    VB.NET-Quellcode

    1. File.Replace(ersetze, "")


    statt

    VB.NET-Quellcode

    1. File = File.Replace(ersetze, "")


    geschrieben :D Jetzt funktioniert alles und die Daten komen nach ein paar millisekunden, wies sein sollte.
    Danke an alle, die mir geholfen haben!