JavaScript xPath

Darklord

XHTML|PHP|SQL|C
ID: 227795
L
19 September 2006
981
73
Ich würde gerne ein Greasemonkey Skript schreiben, doch ich scheitere schon an einfachen Grundlagen mit der Verwendung von xPath. Die Beispiele bei Google haben nicht funktioniert, eventuell hab ich etwas wichtiges übersehen.

Problemstellung:
Es liegt mir eine Tabelle vor.
Die Anzahl der Zeilen ist variabel.
Einzelne Nodes auslesen.
Eine weitere Spalte anhängen.




Bsp.:
HTML:
<table style="width: 820px;" class="borderlist">
<tbody><tr>
    <th>Befehl</th>
    <th>Ziel</th>
    <th>Herkunft</th>
    <th>Ankunft</th>
    <th>Ankunft in</th>
</tr>

<tr>
    <td class="list1"><img src="https://s6.seite.de/img/command/attack.png"/> Angriff</td>
    <td class="list1">
        <a href="game.php?village=3693&s=info_player&id=1497">KingKai88</a><br/>
        <a href="game.php?village=3693&s=info_village&id=1413">{-003-} (533|519) K55</a>    </td>
    <td class="list1">
        <a href="game.php?village=3693&s=info_player&id=1922">~Winnie pooh~</a> <a href="game.php?village=3693&s=info_ally&id=247">[~DKG~]</a><br/>
        <a href="game.php?village=3693&s=info_village&id=1981">001 ---MONSTERBÄR--- (553|502) K55</a>    </td>
    <td class="list1">Heute um 15:56 Uhr</td>
    <td class="list1"><span reload="true" time="2555" class="countdown">0:42:35</span></td>
<td class="list1"/></tr>
<tr>
    <td class="list0"><img src="https://s6.seite.de/img/command/attack.png"/> Angriff</td>
    <td class="list0">
        <a href="game.php?village=3693&s=info_player&id=1497">KingKai88</a><br/>
        <a href="game.php?village=3693&s=info_village&id=2021">{-004-} (532|519) K55</a>    </td>
    <td class="list0">
        <a href="game.php?village=3693&s=info_player&id=2928">Rabauke1</a> <a href="game.php?village=3693&s=info_ally&id=265">[GdT]</a><br/>
        <a href="game.php?village=3693&s=info_village&id=3017">R1.0 (524|544) K55</a>    </td>
    <td class="list0">Heute um 17:18 Uhr</td>
    <td class="list0"><span reload="true" time="7502" class="countdown">2:05:02</span></td>
</tr>
<tr>
    <td class="list1"><img src="https://s6.seite.de/img/command/attack.png"/> Angriff</td>
    <td class="list1">
        <a href="game.php?village=3693&s=info_player&id=241">theunvisible</a><br/>
        <a href="game.php?village=3693&s=info_village&id=238">theunvisibles Siedlung (496|517) K54</a>    </td>
    <td class="list1">
        <a href="game.php?village=3693&s=info_player&id=3188">Blakkur der Dunkle</a> <a href="game.php?village=3693&s=info_ally&id=26">[*E*M*K]</a><br/>
        <a href="game.php?village=3693&s=info_village&id=2271">Blakkur City (486|555) K54</a>    </td>
    <td class="list1">Heute um 22:43 Uhr</td>
    <td class="list1"><span reload="true" time="27006" class="countdown">7:30:06</span></td>
</tr>
<tr>
    <td class="list0"><img src="https://s6.seite.de/img/command/attack.png"/> Angriff</td>
    <td class="list0">
        <a href="game.php?village=3693&s=info_player&id=35">Seraphimo</a><br/>
        <a href="game.php?village=3693&s=info_village&id=301">E-Town (481|513) K54</a>    </td>
    <td class="list0">
        <a href="game.php?village=3693&s=info_player&id=3188">Blakkur der Dunkle</a> <a href="game.php?village=3693&s=info_ally&id=26">[*E*M*K]</a><br/>
        <a href="game.php?village=3693&s=info_village&id=2271">Blakkur City (486|555) K54</a>    </td>
    <td class="list0">Heute um 23:37 Uhr</td>
    <td class="list0"><span reload="true" time="30206" class="countdown">8:23:26</span></td>
</tr>
<tr>
    <td class="list1"><img src="https://s6.seite.de/img/command/attack.png"/> Angriff</td>
    <td class="list1">
        <a href="game.php?village=3693&s=info_player&id=78">Siouxsie</a><br/>
        <a href="game.php?village=3693&s=info_village&id=44">West Ham (482|500) K54</a>    </td>
    <td class="list1">
        <a href="game.php?village=3693&s=info_player&id=3188">Blakkur der Dunkle</a> <a href="game.php?village=3693&s=info_ally&id=26">[*E*M*K]</a><br/>
        <a href="game.php?village=3693&s=info_village&id=2271">Blakkur City (486|555) K54</a>    </td>
    <td class="list1">am 30.09. um 03:30 Uhr</td>
    <td class="list1"><span reload="true" time="44226" class="countdown">12:17:06</span></td>
</tr>
</tbody>
</table>
bspc.png

Die Tabelle habe ich, aus der gesamten Seite, mit diesem Suchmuster
PHP:
var Pattern  = ".//*[@id='main_content']/tbody/tr[2]/td/div[6]/div/table/tbody/tr";
gefiltert.

Nun möchte ich as Ergebniss das
PHP:
var atable = document.evaluate(Pattern, document, null, XPathResult.ANY_TYPE, null);
liefert verarbeiten.

Nur leider habe ich bis jetzt nichts gefunden wie ich dies anstellen kann. Meine Versuche mit einer while Schleife und mittels iterateNext() sind alle kläglich gescheitert.

Ich vermisse eine Debug Funktion wie var_dump oder print_r in Javascript. :-(

Wie stelle ich es nun an über die einzelnen Zeilen zu iterieren?
 
Danke für den Tipp!
Allerdings bekomme ich keine verwentbaren Informationen. (Bzw. ich weiß nicht was damit anfangen.)
firebug.png
 
Das Problem ist dein XPath. Der findet schon keine Results. Habs eben kurz mit ner XML Datenbank ausprobiert. Ergebnis: NULL.

Also solltest du nochmals dein XPath überarbeiten. Falls JavaScript XQuery unterstützt würde ich das an deiner Stelle verwenden.
 
@ryk: Den Code kann man natürlich nicht 1zu1 übernehmen. Es dient nur zu Veranschaulichung. Der xPath ist korrekt und stammt aus Firebug. Firebug liefert auch für den Pfad 7 Ergebnisse. (7 matching nodes)

@tleilax: Diese Seite habe ich auch schon angesehen. Mein Problem ist das iterateNext() hier irgendwie nicht zu funktionieren scheint. Ich poste gleich mal mein neuen Ansatz.
 
So also, ich habe mir jetzt eine Funktion geholt die xPath handelt. Mit dieser geht es! Fragt mich net warum das nicht auch vorher ging, ohne Funktion...

PHP:
var $;

function $x() {
  var x='';
  var node=document;
  var type=0;
  var fix=true;
  var i=0;
  var cur;
    
  function toArray(xp) {
    var final=[], next;
    while (next=xp.iterateNext()) {
      final.push(next);
    }
    return final;
  }
  
  while (cur=arguments[i++]) {
    switch (typeof cur) {
      case "string": x+=(x=='') ? cur : " | " + cur; continue;
      case "number": type=cur; continue;
      case "object": node=cur; continue;
      case "boolean": fix=cur; continue;
    }
  }
  
  if (fix) {
    if (type==6) type=4;
    if (type==7) type=5;
  }
  
  // selection mistake helper
  if (!/^\//.test(x)) x="//"+x;

  // context mistake helper
  if (node!=document && !/^\./.test(x)) x="."+x;

  var result=document.evaluate(x, node, null, type, null);
  if (fix) {
    // automatically return special type
    switch (type) {
      case 1: return result.numberValue;
      case 2: return result.stringValue;
      case 3: return result.booleanValue;
      case 8:
      case 9: return result.singleNodeValue;
    }
  }

  return fix ? toArray(result) : result;
}

 var pattern  = ".//*[@id='main_content']/tbody/tr[2]/td/div[6]/div/table/tbody/tr";
 var table = $x(pattern, XPathResult.ANY_TYPE);
 
 table.forEach(function(table) { 
  console.dir(table);
  table.innerHTML += '<td class="list1"><a href=#>TEST</a></td>';
});