Announcement

Collapse
No announcement yet.

Spezielles XML-Parsing-Problem... neue Variablen, wenn doppelte Einträge

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

  • Spezielles XML-Parsing-Problem... neue Variablen, wenn doppelte Einträge

    Hallo werte JavaScript-Freunde,

    ich habe ein Problem.

    ich habe eine XML-Datei, die wie folgt aufgebaut ist:

    <markers>
    <marker name="Paul" tel="03456" x="13.35" y="52.54" />
    <marker name="Lisa" tel="18756" x="13.35" y="52.54" />
    <marker name="Hans" tel="79853" x="13.21" y="52.14" />
    <marker name="Susi" tel="98756" x="13.24" y="52.38" />
    ...
    </markers>


    In JavaScript parse ich die Daten wie folgt:

    downloadUrl("Daten.xml", function(data){
    var xml = parseXml(data);
    var markers = xml.documentElement.getElementsByTagName("marker") ;
    for (var i = 0; i < markers.length; i++){
    var name = markers[i].getAttribute("name");
    var tel = markers[i].getAttribute("tel");
    var x = parseFloat(markers[i].getAttribute("x"));
    var y = parseFloat(markers[i].getAttribute("y"));

    // Verarbeitung der Daten in Javascript
    html = name + "<br>" + tel;
    ...
    }
    });


    Das funktioniert auch alles wunderbar.

    Jetzt gibt es eine Besonderheit, Paul und Lisa haben die selben Koordinaten. Wenn das der Fall ist, sollen neue Variablen "name2" und "Tel2" erzeugt werden. Diese könnten dann auch verarbeitet werden, zum Beispiel:

    html = name + "<br>" + tel + "<br><br>" + name2 + "<br>" + tel2;

    Ich bräuchte also irgendwas in der Form von IF x == x || y == y, DANN New var name2 ... leider weiß ich nicht wie. Kann mir jemand weiterhelfen? Danke im voraus.

  • #2
    Grundvoraussetzung ist, dass du zumindestens die als vorletztende bearbeitete Zeile in einer temporären Variable ablegst oder alle Daten in einem Array, damit ein Vergleich erfolgen kann.

    Dann vergelichst du den Namen und die Koordinaten der akutellen Zeile mit der davor bearbeitetenn Zeile und fügst entweder dem Array ein weiteren Eintrag zu oder erzeugst direkt deine 2. Ausgabe.


    Das if-Konstrukt kann direkt aus getAttribute("name");getAttribute("x")); und getAttribute("y")); gebildet werden. Also

    Wenn Name des vorletzten == Name des aktuellen UND X-Koordintate des Vorletzten == X-Koordinate des aktuellen UND
    Y-Koordintate des Vorletzten == Y-Koordinate des aktuellen

    dann

    Nimm neuen in das Array auf oder erzeuge 2. Ausgabe


    Christian

    Comment


    • #3
      Danke Christian für die Hinweise!

      Leider funktioniert es noch nicht.

      Zum einen frage ich mich, wie ich richtig die Vorletzte Array-Zeile ansprechen kann. Mit i-- scheint es nicht zu klappen, i++ hingegen funktioniert wunderbar, allerdings nur maximal zweimal. Ich finde das sehr verwirrend.

      Weiß wer, woran das liegt?
      PS: Koordinaten sind sortiert.

      downloadUrl("Daten.xml", function(data){
      var xml = parseXml(data);
      var markers = xml.documentElement.getElementsByTagName("marker") ;
      for (var i = 0; i < markers.length; i++){

      var x_davor = parseFloat(markers[i--].getAttribute("x")); // Index [-1] unbekannt... was dagegen tun?
      var y_davor = parseFloat(markers[i--].getAttribute("y")); // -"-

      var name = markers[i].getAttribute("name");
      var tel = markers[i].getAttribute("tel");
      var x = parseFloat(markers[i].getAttribute("x"));
      var y = parseFloat(markers[i].getAttribute("y"));

      var x_danach = parseFloat(markers[i++].getAttribute("x")); // funktioniert
      var y_danach = parseFloat(markers[i++].getAttribute("y")); // -"-

      if ( x_danach == x && y_danach == y) {
      var name2 = markers[i++].getAttribute("name"); // ein drittes mal geht es nicht
      var tel2 = markers[i++].getAttribute("tel"); // -"-
      }

      if ( x_davor != x || y_davor != y ) {

      // Verarbeitung der Daten in Javascript
      html = name + "<br>" + tel + "<br><br>" + name2 + "<br>" + tel2;
      ...
      }

      }
      });
      Zuletzt editiert von nelson; 07.08.2010, 23:42.

      Comment


      • #4
        Mit i-- scheint es nicht zu klappen
        Sicher nicht im ersten Durchlauf, wenn i=0 ist....
        Christian

        Comment


        • #5
          so funktioniert es...

          downloadUrl("Daten.xml", function(data){
          var xml = parseXml(data);
          var markers = xml.documentElement.getElementsByTagName("marker") ;
          for (var i = 1; i < (markers.length - 1); i++){

          var x_davor = parseFloat(markers[i-1].getAttribute("x"));
          var y_davor = parseFloat(markers[i-1].getAttribute("y"));

          var name = markers[i].getAttribute("name");
          var tel = markers[i].getAttribute("tel");
          var x = parseFloat(markers[i].getAttribute("x"));
          var y = parseFloat(markers[i].getAttribute("y"));

          var x_danach = parseFloat(markers[i+1].getAttribute("x"));
          var y_danach = parseFloat(markers[i+1].getAttribute("y"));

          if ( x_danach == x && y_danach == y) {
          var name2 = markers[i+1].getAttribute("Name");
          var tel2 = markers[i+1].getAttribute("tel");
          }

          if ( x_davor != x || y_davor != y ) {

          // Verarbeitung der Daten in Javascript
          html = name + "<br>" + tel + "<br><br>" + name2 + "<br>" + tel2;
          ...
          }

          }
          });

          Comment


          • #6
            Wenn es funktioniert ist es ja schön, aber dein Vorgehen ist verbesserungswürdig:

            Trenne das parsen und die Verarbeitung. Erstelle eine Funktion, die das Parsen übernimmt und als Ergebnis ein Array mit den zu verarbeitenden Daten zurückgibt.

            Erstelle eine weitere Funktion, die die Verarbeitung übernimmt. Diese bekommt als Parameter das erstellte Array.
            Christian

            Comment

            Working...
            X