XPath .evaluate () ничего не возвращает - PullRequest
0 голосов
/ 08 апреля 2011

У меня проблема с тем, что XPath возвращает что-либо.Я пробовал только в Firefox, но я использовал несколько разных примеров, и ни один из них не работает.

function populateFilters(productType) {
callAjax.request({
    url: './Products.xml',
    onSuccess: function(rootNode, fullText) {
        var path = '//product';
        // code for IE
        if (window.ActiveXObject)
            var nodes=rootNode.selectNodes(path);
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation && document.implementation.createDocument)
            var nodes=rootNode.evaluate(path, rootNode, null, 0, null);

        for (var i = 0; i < nodes.length; ++i) {
            nodes[i].childNodes[0];
        }
    },
    onError: function(errCode, responseStatus) {alert('An error has occured. Please contact the site\'s Webmaster.\n\n' + errCode + '\n' + responseStatus);}
    });
}

Вызов ajax работает нормально ... Я получаю документ XMLи могу перемещаться по DOM без проблем.У меня проблема в том, что когда код отвечает на вызов rootNode.evaluate(), ничего не возвращается.Нет ошибок и нет данных.Вот пример фрагмента XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <product>
        <type>Snowboard</type>
        <brand>DC</brand>
    </product>
    <product>
        <type>Skateboard</type>
        <brand>Banana</brand>
    </product>
    <product>
        <type>Clothing</type>
        <brand>BoardDokter</brand>
    </product>
</root>

Единственное, о чем я могу думать, это то, что var path = '//product'; неверен, но я рассмотрел много примеров, и он действительно должен работать.

У кого-нибудь есть идеи?Firefox 4 в Windows XP и Windows 7.

1 Ответ

3 голосов
/ 08 апреля 2011

document.evaluate возвращает объект XPathResult, полезные методы которого зависят от аргументов:

  • неупорядоченные (4) и упорядоченные (5) итераторы дают объект с iterateNext(), который возвращает каждый узел, а затем возвращает null.
  • неупорядоченный (6) и упорядоченный (7) снимки, которые дают объект с snapshotLength и snapshotItem(index).
  • любой (0) даст вам неупорядоченный итератор, если ваше выражение XPath возвращает узлы.

Так как четвертый аргумент для оценки равен 0, он дал вам неупорядоченный итератор, который вы должны вызватьiterateNext() вкл.Вероятно, это не тот, который вам нужен (большинство людей хотят гарантированный заказ).

См. Документацию Mozilla по document.evaluate или ссылку W3C по document.evaluate для получения более подробной информации.

var xml = '<?xml version="1.0" encoding="ISO-8859-1"?>\n' +
  '<root>\n' +
  '    <product>\n' +
  '        <type>Snowboard</type>\n' +
  '        <brand>DC</brand>\n' +
  '    </product>\n' +
  '    <product>\n' +
  '        <type>Skateboard</type>\n' +
  '        <brand>Banana</brand>\n' +
  '    </product>\n' +
  '    <product>\n' +
  '        <type>Clothing</type>\n' +
  '        <brand>BoardDokter</brand>\n' +
  '    </product>\n' +
  '</root>';
var path = '//product';
var doc = (new DOMParser).parseFromString(xml, 'text/xml');

// choice 1: use iterator
var it = doc.evaluate(path, doc, null, 5, null);
var nodes1 = [];
var node;
while (node = it.iterateNext()) {nodes1.push(node);}

// choice 2: use snapshot
var snapshot = doc.evaluate(path, doc, null, 7, null);
var nodes2 = [];
for (var i = 0; i < snapshot.snapshotLength; i++) {
  nodes2.push(snapshot.snapshotItem(i));
}

Полезный совет: введите $x в консоль Javascript в Chrome, чтобы увидеть источник их функции для превращения XPath в массив Javascript.

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