Команда Quizful благодарит наших пользователей за пополнение базы тестов:
- тест по ADO.NET составила zavisimosti
- тест по Qt составил VaiMR

Темы, которые касаются не только тестов и сервиса Quizful, вы можете создавать в новом разделе Обсуждения.
Знаете ли Вы, что

В разделе "Статьи" можно найти обучающие статьи по информационным технологиям, а также узнать о новостях сервиса Quizful.

Топ контрибуторов
loading
loading
Лента обновлений
ссылка 11:01:14
Комментарий от udjin:
По моему, сигналы всегда protected. Например, если посмотр...
ссылка 10:39:13
Комментарий от c0nst:
1. Тест по основам - он проверяет в основном знание синтак...
ссылка 10:17:45
Комментарий от mixim:
в IDE можно не построчное выделение делать, а поколоночное...
ссылка Sep 8 23:25
Комментарий от QUIZlogin:
Из спецификации и исходников Java 5 видно,что Enum Thr...
ссылка Sep 8 23:24
Комментарий от DmitriyVorobjev:
Только как исправить, модеры помогите, нет прав ...
Статистика

Тестов: 130, вопросов: 5349. Пройдено: 58950 / 203339.

XPath в JavaScript

head tail Информация о статье
категория
Веб технологии
дата16.07.2009
авторbav
голосов6

[Disclaimer: Данная статья была переведена в рамках "Конкурса на лучший перевод статьи" на сервисе Quizful. Ссылка на оригинал находится внизу страницы.]

Введение в XPath на JavaScript

Часто программистам на javascript не хватает возможности оперировать с DOM-моделью более простым и лаконичным способом, чем вызовы типа getElementById. В этой статье описывается JavaScript-интерфейс для доступа к функциям XPath в обычном простом HTML.

Библиотека XPath для JavaScript реализует большую часть спецификации "DOM Level 3 XPath". Это позволяет выполнять выражения XPath как в HTML- так и в XML-документах.

Прежде всего, простейший интерфейс к XPath состоит в функции evaluate объекта document, которая возвращает объект типа XPathResult:

var xpathResult = document.evaluate(xpathExpression, contextNode, 
namespaceResolver, resultType, result
);

Функция evaluate принимает всего 5 аргументов:

  1. xpathExpression - строка, содержащая выражение xpath, которое нужно вычислить;
  2. contextNode - узел документа, по отношению к которому должно быть вычислено выражение xpath;
  3. namespaceResolver - функция, принимающая строку с префиксом пространства имен из xpathExpression и возвращающая строку, содержащаю URI, которому соответствует этот префикс. Она дает возможность проеобразования между префиксами, используемыми в выражениях xpath и (возможно отличными) префиксами, используемыми в документе;
  4. resultType - числовая константа, указывающая тип возвращаемого результата. Эти константы доступны в глобальных объектах XPathResult и определены в соответствующем разделе спецификации Xpath. Для большинства целей можно передавать XPathResult.ANY_TYPE, что приводит к возврату результата выражения Xpath в наиболее естественном виде;
  5. result - существующий XPathResult, используемый для результатов. Передача null приводит к созданию нового XPathResult.

Простой пример использования XPath

Элементарное использование XPath - извлечениe заголовков 2-го уровня из HTML документа. Выражение XPath в этом случае просто: //h2. Тогда код для этого:

var headings = document.evaluate("//h2", document, null, 
XPathResult.ANY_TYPE, null
);

Заметим, так как HTML не имеет пространства имен, мы передали null в качестве namespaceResolver. Поскольку мы хотим искать заголовки по всему документу, мы использовали сам объект document в качестве contextNode.

Результат этого выражения есть объект XPathResult. Если мы хотим узнать тип полученного результата, мы можем проверить свойство resultType полученного объекта. В данном случае будет получено 4, что согдасно привязки XPATH к языку ECMAScript(ECMAScript Language Binding) представляет UNORDERED_NODE_ITERATOR_TYPE. Это тип возвращаемого результата по умолчанию, когда результатом выражения XPath является множество узлов. Он дает нам возможность обращаться к одному узлу за раз, но не дает какого-либо обещания относительно порядка, в котором будут возвращены узлы. Для доступа к полученным узлам мы можем использовать метод iterateNext полученного объекта:

var thisHeading = headings.iterateNext();
var alertText = "Заголовки уровня 2 этого документа:\n"

while (thisHeading) {
alertText += thisHeading.textContent + "\n"
thisHeading = headings.iterateNext();
}
alert(alertText);

Библиотека XPath

Реализация библиотеки XPath 1.0 в JavaScript должна работать одинаково в большинстве современных браузерах (в том числе и в IE). Библиотека распространяется под GNU Lesser General Public License.

Скачать библиотеку можно на этой странице - xpath.zip

Ниже представлено еще несколько примеров.

Пример для подсчета всех ссылок в документе с помощью одного xpath запроса:

var linkCount = document.evaluate(“count(//a[@href])“, document, 
null, XPathResult.NUMBER_TYPE, null
).getNumberValue();

Получение всех картинок без тега alt:

var imgIterator = document.evaluate(“//img[not(@alt)]“, document,
null, XPathResult.ANY_TYPE, null
);

Нахождение первого дочернего li элемента для всех ul:

var firstLiIterator = document.evaluate(“//ul/li[1]“, document,
null, XPathResult.ANY_TYPE, null
);

----------
Оригинальный текст статьи: XPath in JavaScript

Если Вам понравилась статья, проголосуйте за нее

Голосов: 6  loading...
Faceless   googperson   googman   googler   yohan   k0stya  
Комментариев: 4
 doberman31.07.2009 | 13:59:12#
Откуда взялся метод .getNumberValue() у объекта результата? В интерфейсе объекта я его не нашел. Нашел свойство numberValue при обращении к которому и получал количество найденных совпадений. И в ФФ заработало только при обращении к свойству, а не методу.
ответить
 bav03.08.2009 | 16:23:07#
Во первых, должен сказать, что перед Вами не оригинальная статья, а перевод.
Причем перевод не только страницы http://js-xpath.sourceforge.net/xpath-tutorial.html,
сделанный мной, но также перевод страницы http://js-xpath.sourceforge.net/xpath-example.html,
сделанный кем-то помимо меня.
Если Вы потрудитесь проверить, приведенные ссылки, то увидите,
что с одной стороны Ваш вопрос относится к моему анонимному пока соавтору
перевода, а с другой стороны, что этот соавтор правильно привел примеры
программного текста из оригинальной статьи.
ответить
 bav03.08.2009 | 16:25:56#
Продолжение ответа.
Xотя на страницах сайта http://js-xpath.sourceforge.net/ мне не удалось, найти
автора приведенного там материала, то после чтения файла xpath.js, скаченного
с этого же сайта, который содержит реализацию Javascript XPath для MS IE 5+,
("Copyright (C) 2004 Dimitri Glazkov Modified 2006 Mehdi Hassan",
с методом .getNumberValue()), а также чтения спецификаций "DOM Level XPath"(http://www.w3.org/TR/DOM-Level-3-XPath)
и Appendix B:"Java Language Binding"(http://www.w3.org/TR/DOM-Level-3-XPath/java-binding.html), напрашивается ответ, что автором оригинальной статьи является
либо сам Dimitri Glazkov, либо кто-то изучавший xpath по его реализации,
а сам же он cделал свою реализацию xpath, либо не читая рекомендаций для Javascript и используя
свой опыт применения Xpath в Java, либо "сознательно" делая в стиле Java - например, для своего удобства.
ответить
 yohan18.07.2009 | 17:34:28#
Спасибо. Интересная статья.
ответить
Добавить комментарий