Opera JS: XPath для поиска ссылок, содержащих путь - PullRequest
0 голосов
/ 09 июля 2011

Я использую Opera 11.50 и у меня есть JavaScript-функция, которая работает как обратный вызов Ajax-запроса:

function nextPageCallback(responseText, responseXML) {
    if (responseXML && responseXML.documentElement) doc = responseXML.documentElement;
    else {
        doc = document.createElement("html");
        doc.innerHTML = responseText.replace(/[\n\r]/g, "").replace(/^.*\<html.*?\>|\<\/html.*$/i, "");
    }
    table = doc.getElementsByTagName("table")[1];

    if (table) {
        var trs;

        trs = document.evaluate("descendant::tr[count(td) > 1]", table, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

        for (var pos = 0; pos < trs.snapshotLength; pos++) {
            var tr = trs.snapshotItem(pos);
            var link;

            link = tr.innerHTML.match(/href=["'](\/path\/[^"']+?)["']/i)[1];
            linkX = document.evaluate("descendant::a[contains(@href, '/path/')]", tr, null, XPathResult.STRING_TYPE, null);
        }
    }
}

Основная идея состоит в том, чтобы проанализировать table для определенных ссылок, а затем сделать что-то с A - и TR -элементами (дальнейший код не имеет смысла для этой проблемы и поэтому опущен).

Назначение trs работает, в снимке есть элементы. TR s будет перемещен позже, поэтому мне нужен снимок.

Проблема с двумя последними строками. link назначается с помощью обычного старого (подверженного ошибкам) ​​RegEx и до сих пор работает, поскольку была только одна ссылка, содержащая «/ path /». Теперь linkX должно получиться с тем же значением. Если вы удивляетесь, почему существует STRING_TYPE, ничего больше не работает, даже ANY_TYPE (все они вызывают XPathException: TYPE_ERR).

linkX устанавливается на то, что кажется текстом ссылки или innerText элемента A. Однако мне нужен атрибут href.

Я уже пробовал разные вещи, такие как использование средства разрешения имен

function nsr() {
    return "http://www.w3.org/1999/xhtml";
}
:
            linkX = document.evaluate("descendant::a[contains(@href, '/path/')]", tr, nsr, XPathResult.STRING_TYPE, null);

но он даже не называется.

В конце XPath я также добавил больше вещей, например /parent::node(), но ничего не работает.

Есть ли что-то, что я использую DOM-структуру, которая была возвращена document.evaluate()? Мой XPath неверен? Как мне это исправить?


РЕДАКТИРОВАТЬ : По запросу, вот пример ответа, который появляется в responseText.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>Type</th>
          <th>Id</th>
          <th>Name</th>
          <th>Serialnumber</th>
        </tr>
      </thead>
      <tr>
        <td>Media</td>
        <td><a href="/path/2355">2355</a></td>
        <td>Sampler</td>
        <td>A65270-D32</td>
      </tr>
      <!-- more TRs of the structure above -->
      <tr>
        <td colspan="4" style="text-align:center;">
          <a href="/list/1">Previous</a>&nbsp;
          <a href="/list/3">Next</a>&nbsp;
        </td>
      </tr>
    </table>
  </body>
</html>

Относительно кода выше он выполняет else:

else {
    doc = document.createElement("html");
    doc.innerHTML = responseText.replace(/[\n\r]/g, "").replace(/^.*\<html.*?\>|\<\/html.*$/i, "");
}

Код должен найти все TR s и в TR ссылку, содержащую "/ path /". Для дальнейшей обработки мне нужен TR -элемент и href -атрибут A.

1 Ответ

1 голос
/ 10 июля 2011

Код должен найти все TR s и в TR ссылку, содержащую "/ path /".Для дальнейшей обработки мне нужны TR -элемент и href -атрибут A.

Это выражение XPath выбирает нужные узлы :

 //x:tr[//x:a[contains(@href, '/path/')]]
|
 //x:tr//x:a/@href[contains(.,'/path/')] 

Здесь префикс x должен быть связан с пространством имен (по умолчанию) "http://www.w3.org/1999/xhtml".

Обратите внимание, что XML и XPath чувствительны к регистру - в предоставленном документе XML нет элемента с именами в верхнем регистре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...