Доступ к набору узлов в запросе JavaScript XPath - PullRequest
6 голосов
/ 28 октября 2010

У меня очень простой вопрос, на который я не могу найти ответ.

Я хочу сжать два оператора XPath (которые получают значения атрибутов).Я узнал об операторе |, узнав, как он возвращает наборы узлов.

var getdata = xmldoc.evaluate
(
    '/foo/bar[@world=\''+hello+'\']/child::*/attribute::name
    |/foo/bar[@world=\''hello+'\']/child::*/attribute::id', 
    xmldoc, null, XPathResult.ANY_TYPE, null
);

Всем, кто интересуется, нет, я не форматирую свои строки оценки таким образом ... хотя, мне сейчас нравитсячто я его напечатал.В любом случае, вот как я это проверил.

alert(getItemData.iterateNext().childNodes[0].nodeValue);

Это работает!Но он возвращает только первый.При написании этого я просто попробовал .length и сделал прорыв ... он считает только один предмет.Я был обманут о понятии |?Как я могу получить набор и затем просмотреть его?

XML-документ, как и было запрошено.

<?xml version="1.0" encoding="ISO-8859-1"?>
<foo>
    <bar world="hello" id="1">
        <subbar name="item1" id="2">
        </subbar>
    </bar>
    <bar world="bye" id="3">
        <subbar name="item2" id="4">
        </subbar>
    </bar>
</foo>

Редактировать: в настоящее время я использую функцию, которая захватывает элемент, а не атрибут,но мне бы очень хотелось узнать другой путь.Если то, что я делаю, не лучший способ.

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

Если JQuery является опцией, возможно, стоит попробовать их библиотеку обхода XML. Быстрый поиск вытащил статью здесь . Я написал очень грубый пример того, как может выглядеть логика после импорта XML-документа, что объясняется в ссылке.

var hello = "foo";
$('bar[world=' + hello + '] > subbar').each(function () {
    // You'd want to save these values somewhere else, obviously.
    $(this).getAttribute(name);
    $(this).getAttribute(id);
});
1 голос
/ 04 ноября 2010

Ключом здесь является тип XPathResult, который вы используете.

Я реализовал рабочий образец для того же самого.Пожалуйста, обратитесь к коду на http://jsbin.com/eneso3/5/edit

В основном вы должны использовать Iterator как тип результата, так что мы можем перебрать их, чтобы получить текст.См. Ссылку на Xpath, указанную на странице примера рабочего кода.

0 голосов
/ 31 октября 2010

Что ж, вы правильно используете "pipe" (http://www.tizag.com/xmlTutorial/xpathbar.php), поэтому единственный код, который я вижу, может быть отключен - это отсутствующий + во второй команде xpath, но это может быть псевдокод, поэтому ябудет считать это только половинным ответом. Что касается наилучшей практики, то, по моему мнению, я бы взял элемент subbar, а затем получил бы его атрибуты, где вам нужна их оптимизация, подобная той, которую вы предложили, которая затемняет какие данные ссылаются.слишком много микрооптимизации, но это всего лишь мнение. Возможно, у вас длинный список атрибутов, и вы действительно экономите время разбора.

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