Я использую 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>
<a href="/list/3">Next</a>
</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
.