MonteLucon: So klappt's: XML mit JavaScript auslesen (auch mit Firefox)

Hier eine Möglichkeit, wie ich XML-Daten mit JavaScript im Internet Explorer (IE), Opera und selbst auch dem Firefox auslesen und verarbeiten kann.
Ich schreibe, es da mich der Firefox vor ein sehr großes Problem stellte und ich im Web keine Lösung fand.

Hier die Daten, die im XML-Format übergeben werden.
Wie die Daten ankommen, per Ajax oder in einer Datei, ist egal.
Ich setze mal voraus, dass Ihr wisst wie das geht.

Das Prinzip:
----------------------------------------------------------------
Die XML-Daten werden ausegelesen und in einem Array gespeichert.
Dabei handelt es sich um eine 2-dimensionales Array, mit
einer fortlaufenden Nummer und den Tagnamen aus der XML.

Man kann also die Variablen im Array direkt mit den Variablennamen
aus der XML ansprechen.

Der JavaScript-Code ist mit dem IE ab 5.5, dem Opera ab 7 und dem
Firefox ab 2.x getestet und funktioniert.

Hier das Format, wie die XML ausgebaut ist:
----------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<response>
  <info>
    <servicetitle>the title</servicetitle>
    <pageno>xyz</pageno>
    <items>abc</items>
    <itemperpage>X</itemperpage>
    <assignto>zzz</assignto>
  </info>

<usedvariables>
    <group>description</group>
    <partnumber>description</partnumber>
    <descr1>description</descr1>
    <descr2>description</descr2>
    <descr3>description</descr3>
  </usedvariables>

<modelnumber name="1234567">
    <group>text or number</group>
    <partnumber>text or number</partnumber>
    <descr1>text or number</descr1>
    <descr2>text or number</descr2>
    <descr3>text or number</descr3>
    <modelimage>text or number</modelimage>
  </modelnumber>

<modelnumber name="abcdefg">
    <group>text or number</group>
    <partnumber>text or number</partnumber>
    <descr1>text or number</descr1>
    <descr2>text or number</descr2>
    <descr3>text or number</descr3>
    <modelimage>text or number</modelimage>
  </modelnumber>

<modelnumber name="1a2b3c4">
    <group>text or number</group>
    <partnumber>text or number</partnumber>
    <descr1>text or number</descr1>
    <descr2>text or number</descr2>
    <descr3>text or number</descr3>
    <modelimage>text or number</modelimage>
  </modelnumber>

.
  .
  .
  usw.
</response>

Hier das JavaScript um die XML-Daten im Array zu speichern:
----------------------------------------------------------------
function handleXML()
   {
       // Variables
       var arrXML   = new Array();
       var counter  = -1;

var lvl1Data, lvl1Len, lvl1nodeName, lvl1isNode, lvl1Content;
       var lvl2Data, lvl2Len, lvl2nodeName, lvl2isNode, lvl2Content;

// Get the XML Document
       var xmlDoc    = http_request.responseXML.documentElement;
       var xmlDocLen = xmlDoc.childNodes.length;

// Read Parent Node
       for (i=0; i<xmlDocLen; i++)
       {
            lvl1Data      = xmlDoc.childNodes.item(i);
            lvl1Len       = lvl1Data.childNodes.length;
            lvl1nodeName  = lvl1Data.nodeName;
            lvl1isNode    = (lvl1nodeName.indexOf("#") < 0) ? true : false;

// Read only, if is Node
            if (lvl1isNode)
            {
                lvl2Len     = lvl1Data.childNodes.length;
                counter++;

arrXML[counter] = new Object();
                arrXML[counter]["node"] = lvl1nodeName;

// Reade Child Node
                for (j=0; j<lvl2Len; j++)
                {
                     lvl2Data     = lvl1Data.childNodes.item(j);
                     lvl2nodeName = lvl2Data.nodeName;
                     lvl2isNode   = (lvl2nodeName.indexOf("#") < 0) ? true : false;

// Read only, if is Node
                     if (lvl2isNode)
                     {
                         // If Content exists, read it
                         lvl2Content = (lvl2Data.firstChild) ? lvl2Data.firstChild.data : null;
                         arrXML[counter][lvl2nodeName] = lvl2Content;
                     }
                }
            }
       }
       exportXML(arrXML);
   }

function exportXML(arrXML)
{
  // Hier kann das Array weiterverarbeitet werden.
  // Beispiel
  var arrLen  = arrXML.length;
  var ausgabe = "";

for (i=0; i<arrLen; i++)
  {
       if (arrXML(i,"node") == "modelnumber")
       {
           ausgabe = ausgabe + i +". "+ arrXML(i,"group") +" / ";
           ausgabe = ausgabe + i +". "+ arrXML(i,"partnumber") +" / ";
           ausgabe = ausgabe + i +". "+ arrXML(i,"descr1") +" / ";
           ausgabe = ausgabe + i +". "+ arrXML(i,"modelimage") +"<br>";
       }
  }
  document.write(ausgabe);
}

Anmerkung
----------------------------------------------------------------
Wer eine einfacherer oder schnellere Lösung hat, kann diese hier gerne schreiben. Ich wäre dankbar, denn im Netz ist leider sonst nicht zu finden.

Ich hoffe es hilft denen weiter die am Suchen sind.
Ich hatte es am Schluss aufgegeben.

Gruß

MonteLocun

  1. Oops, ein Fehler bei der Augabe, die sollte so heißen:

    function exportXML(arrXML)
    {
      // Hier kann das Array weiterverarbeitet werden.
      // Beispiel
      var arrLen  = arrXML.length;
      var ausgabe = "";

    for (i=0; i<arrLen; i++)
      {
           if (arrXML(i,"node") == "modelnumber")
           {
               ausgabe = ausgabe + i +". "+ arrXML(i,"group") +" / ";
               ausgabe = ausgabe + arrXML(i,"partnumber") +" / ";
               ausgabe = ausgabe + arrXML(i,"descr1") +" / ";
               ausgabe = ausgabe + arrXML(i,"modelimage") +"<br>";
           }
      }
      document.write(ausgabe);
    }