Announcement

Collapse
No announcement yet.

getElementById() im XML-Dokument

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • getElementById() im XML-Dokument

    Hallo liebe Helfer,

    ich hoffe Ihr könnt mir bei meinem Javascirpt/XML-Problem helfen.

    Ich habe eine XML-Datei "test.xml" die ungefähr so aufgebaut ist:

    Code:
        <thema>
    	    <t_name>Name 1</t_name>
    	    <url>/maxvis/2242621/</url>
    	    <ansprechpartner> Sepp</ansprechpartner>
    	    <tags> </tags>
    	    <beschreibung>Hier steht die Beschreibung.. </beschreibung>
        </thema>
        <thema id="16">
    	    <t_name>Name 2</t_name>
    	    <url>/maxvis/2242622/</url>
    	    <ansprechpartner> Max </ansprechpartner>
    	    <tags> </tags>
    	    <beschreibung>Hier steht auch eine Beschreibung.. </beschreibung>
        </thema>
        .... usw ...
    Jetzt baue ich von einer Web-Site eine Verbindung zur Datei auf wie nachfolgend gezeigt:

    Code:
    xmlHttp.open('GET', 'test.xml', true);
    daten = xmlHttp.responseXML;
    Bis hier her ist alles wunderbar und die Welt wird glücklich, aber jetzt will ich einige Daten aus der XML-Datei auslesen und dann auf einer Web-Site einfügen. Wenn ich nun mit
    Code:
    var eintrag = daten.getElementById("16")
    einen "Sprung" zum zweiten Knoten der XML-Datei (mit der ID) aufbauen will, um dort Inhalte auszulesen, dann funktioniert die Sache zwar in Chrome, aber im FF und IE kommt der Fehler "TypeError: daten.getElementById("16") is null" (über Firebug).
    Was mache ich hier falsch? Die Sache funktioniert im Chrome wunderbar, aber leider nur dort.

    Kann ich überhautp im FF und IE mit "getElementById()" auf einen Knoten zugreifen oder nicht?

    Für hilfe jeder Art wäre ich sehr dankbar...

    MfG BBiel

    getElementById();

  • #2
    IDs müssen der Konvention nach mit einem Buchstaben beginnen, setze mal einen vor die Zahl.

    Comment


    • #3
      Hallo,
      das hab ich getestet - bring leider nichts!

      Ich hab das Gefühl, dass getElementById() innerhalb von XML nicht funktioniert. Vielleicht bin ich aber auch aufm Holzweg. Kann ich irgendwie anders auf den Knoten mit der id "Xy" springen?

      Comment


      • #4
        Probiere es mal mit daten.document.getElementById("…"). Ansonsten über daten.getElementsByTagName("thema").item(0 … n-1) iterieren und mittels getAttribute("id") das zutreffende Element suchen.

        Comment


        • #5
          getElementById mit XML-Dokumenten funktioniert nur, so eine DTD das Attribut als Attribut vom Typ ID definiert und diese DTD vom XML-Parser gelesen wird. Mozilla benutzt meines Wissens immer noch Expat als XML-Parser, der nur interne DTDs unterstützt, Chrome meines Wissens libxml, da werden auch externe DTDs unterstützt.

          Mit IE gibt es ein weiteres Problem, responseXML ist bis einschließlich IE 9 MSXML-basiert und ist nicht kompatibel, da gibt es nur eine Methode "nodeFromID", "getElementById" wird nicht unterstützt.

          Als Beispiel, dass Mozilla getElementById mit XML unterstützt und IE halt nodeFromID, siehe http://home.arcor.de/martin.honnen/j...012091301.html.

          So du eventuell nur an IE 9 und den anderen Browser interessiert bist und getElementById mit XML-Dokumenten mit allen Browsern benutzen willst, dann empfiehlt es sich, wie in http://home.arcor.de/martin.honnen/j...012091302.html, den responseText per DOMParser zu parsen, dann ist das DOM in IE nicht mehr MSXML-basiert, sondern IE- bzw. MSHTML-basiert, und da wird getElementById als Methode unterstützt (aber auch nur mit DTD).

          Comment


          • #6
            Als Alternative, um per Attributwert auf Elemente zuzugreifen, IE mit MSXML unterstützt XPath:
            Code:
            var node = req.responseXML.selectSingleNode("//*[@id = '1']")
            Mozilla und Opera bieten XPath auch, allerdings per "evaluate"-Methode http://www.w3.org/TR/DOM-Level-3-XPa...ator-evaluate:
            Code:
            var node = req.responseXML.evaluate("//*[@id = '1']", req.responseXML, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
            .

            Comment

            Working...
            X