Jan: XML-Daten mit JavaScript abfragen

Hallo zusammen,

ich habe für meinen Pocket-Pc (läuft auf Windows Pocket-PC 2003) eine Applikation entwickelt. Die Daten liegen in einem XML-File vor und werden mittels JavaScript abgefragt. Da es sich um ca. 2000 Datensätze handelt, welche wiederum aus ca. 8 Kindknoten bestehen, ist die Performance der Abfragen ganz bescheiden. Das ganze sieht ca. so aus:

<daten>
 <datensatz>
  <a/>
  <b/>
  ...
 </datensatz>
 <datensatz>
 ...
 </datensatz>
</daten>

Hat Jemand eine Ideee, wie man die Performance optimieren kann? Habe die Namen der Knoten schon auf das Minimum reduziert, so dass die XML-Datei nur noch 370 KB groß ist. Außerdem habe ich die Abfrage bereits so abgeändert, daß sie nicht mehr alle Knoten durchläuft, sondern nur noch einen bestimmten Knoten eines jeden Datensatzes. Läuft aber immer noch zu langsam.

Ich stelle natürlich auch den Ansatz JavaScipt + XML grundsätzlich zur Diskussion. Da die ganze Applikation aber nur lokal laufen soll und die Daten ursprünglich aus einer Excel-Datei kommen ist mir keine andere Alternative eingefallen.

Danke und Gruss

Jan

  1. Hallo,

    Hat Jemand eine Ideee, wie man die Performance optimieren kann?

    Zeilenumbrüche, Einrückungen,... machen bei 8 Stufen und ein paar 1000 DS auch was aus. Wenn möglich aus der XML-Datei entfernen. Dann wird das Laden und parsen der Datei schon mal beschleunigt.

    Ciao
    Thomas Grötzner

    --
    Signatur? Was ist das?
  2. Hallo,

    Hat Jemand eine Ideee, wie man die Performance optimieren kann? Habe die Namen der Knoten schon auf das Minimum reduziert, so dass die XML-Datei nur noch 370 KB groß ist. Außerdem habe ich die Abfrage bereits so abgeändert, daß sie nicht mehr alle Knoten durchläuft, sondern nur noch einen bestimmten Knoten eines jeden Datensatzes. Läuft aber immer noch zu langsam.

    Dazu muesstest Du schon etwas konkreter werden. Sind die XML-Daten als Dateninsel in ein HTML-Dokument eingebunden? Welche DOM-Methoden wendest Du wie an?

    MfG, Thomas

    1. Hallo,

      Hat Jemand eine Ideee, wie man die Performance optimieren kann? Habe die Namen der Knoten schon auf das Minimum reduziert, so dass die XML-Datei nur noch 370 KB groß ist. Außerdem habe ich die Abfrage bereits so abgeändert, daß sie nicht mehr alle Knoten durchläuft, sondern nur noch einen bestimmten Knoten eines jeden Datensatzes. Läuft aber immer noch zu langsam.

      Dazu muesstest Du schon etwas konkreter werden. Sind die XML-Daten als Dateninsel in ein HTML-Dokument eingebunden? Welche DOM-Methoden wendest Du wie an?

      MfG, Thomas

      Die XML-Daten sind in einem separaten XML-File. Sie werden mit einem JS abgefragt, welches in eine html-Datei eingebettet ist. Diese sieht so aus:

      <html>
      <head>
      <title>Test</title>
      <script language="JavaScript">
      var WurzelElement;
      var AlleKnoten, AnzahlDerKnoten, AktuellerKnoten, AnzahlDerTagsImAktuellenKnoten, Suchbegriff, LetzterKnoten;
      var a, b, c, d = 0;
      var XMLDokument = new ActiveXObject("microsoft.xmldom");
      XMLDokument.load("ccd.xml");

      function ausgabe()
      {
       Suchbegriff=document.Formular.T1.value;
       if (Suchbegriff != null)
       {
        WurzelElement=XMLDokument.documentElement;
        AlleKnoten=WurzelElement.childNodes;
        AnzahlDerKnoten = WurzelElement.childNodes.length;
        // Tabellenkopf-Layout
        window.document.write("<link type='text/css' rel='stylesheet' href='pi_intranet.css'><p class='standard_ccd'><a href='javascript:location.reload()'>Zurück zur Suche</a></p><table width='100%'><tr class='content_h4'><td>Attribut1</td><td>Attribut2</td><td>Attribut3</td><td>Attribut4</td><td>Attribut5</td><td>Attribut6</td><td>Attribut7</td><td>Attribut8</td><td>Attribut9</td><td>Attribut10</td><td>Attribut11</td></tr>");
        for (a = 0; a < AnzahlDerKnoten; a++)
        {
         //Modifizierung, da nur nach einem Attribut gesucht wird
         AktuellerKnoten = WurzelElement.childNodes.item(a);
         AnzahlDerTagsImAktuellenKnoten = AktuellerKnoten.childNodes.length;
         if (AktuellerKnoten.childNodes.item(0).text.toLowerCase().indexOf(Suchbegriff.toLowerCase()) >= 0 && AktuellerKnoten != LetzterKnoten)
         {
          window.document.write("<tr class='standard_ccd'>");
          for (c=0; c < AnzahlDerTagsImAktuellenKnoten; c++)
          {
           window.document.write("<td>"+AktuellerKnoten.childNodes.item(c).text+"</td>");
           d=1;
           // Änderung
           LetzterKnoten = AktuellerKnoten;
          }
          window.document.write("</tr>");
         }
        }
       }
       window.document.write("</table>");
       if (d==0)
       {
        alert("Suchbegriff nicht gefunden!");
       }
      }

      Gruss

      Jan

      1. Hallo,

        AlleKnoten=WurzelElement.childNodes;

        AnzahlDerKnoten = WurzelElement.childNodes.length;

        besser: AnzahlDerKnoten = AlleKnoten.length;

        (Hinweis: Das sind aber nur die direkten Kindknoten unterhalb des Wurzelelements, wirklich _alle Elementknoten_ wuerde man mit WurzelElement.getElementsByTagName("*") abgreifen.)

        AktuellerKnoten = WurzelElement.childNodes.item(a);

        besser: AlleKnoten.item(a);

        usw.

        Also die mehrfach abgefragten Objekte in Variablen ablegen und dann auf diese zugreifen. Somit muss nicht immer wieder der gesamte DOM-Baum geparst werden.

        Evtl. verhilft auch der Zugriff mittels WurzelElement.getElementsByTagName("elementname") beim selektiven Zugriff zu mehr Performance.

        MfG, Thomas