Различие между Выбрать все атрибуты href и Выбрать все элементы привязки с атрибутами href, используя xpath с php - PullRequest
2 голосов
/ 24 апреля 2011

Учитывая, что в html-документе все якорные элементы имеют атрибут href, который установлен:

В чем разница между следующими запросами xpath

Случай 1:

//@href

Случай 2:

//a/@href

Случай 3:

*/a/@href

В моей ситуации:

//@href возвращает все данные, содержащиеся в атрибуте href.

//a/@href ничего не возвращает, но я ожидаю, что он вернется так же, как //@href

*/a/@href ничего не возвращает, но я ожидаю, что он вернет то же, что и //@href и //a/@href

Боюсь, что я неправильно понимаю, как работают эти запросы.Есть ли кто-нибудь, кто может привести меня в порядок?Заранее благодарю за помощь.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

В чем разница между следующие запросы xpath

Дело 1:

//@href

Выбирает все узлы атрибута href в документе XML.

Случай 2:

//a/@href 

Выбирает все атрибуты href, принадлежащие любому элементу с именем a, который не находится в пространстве имен.

Дело 3:

*/a/@href

Выбирает все атрибуты href, принадлежащие любому элементу с именем a, который не находится в пространстве имен и является внуком текущего (контекстного) узла.

Скорее всего, вы хотели написать :

//*/a/@href

Это выбирает все атрибуты href, принадлежащие любому элементу с именем a, который не находится в пространстве имен и чьим родителем является элемент.

В моей ситуации:

//@href возвращает все данные содержится в атрибуте href.

//a/@href ничего не возвращает, кроме меня ожидайте, что он вернется так же, как //@href

*/a/@href ничего не возвращает, кроме меня ожидайте, что он вернется так же, как //@href и //a/@href

Боюсь, что я ужасно недопонимание, как эти запросы Работа. Есть ли кто-нибудь, кто может установить меня Прямо. Заранее спасибо за ваша помощь.

Очень часто случается, что документ XML имеет пространство имен по умолчанию. Скорее всего, это причина вашей проблемы . В этом случае в документе не существует элемента a, который находится в «пространстве имен», и любое выражение XPath, имеющее a в качестве шага расположения, ничего не выбирает.

Кроме этого, три выражения не эквивалентны .

//@href и //a/@href

может выбирать различные наборы узлов, если в документе есть другие элементы, кроме a, которые имеют атрибут href, или если документ находится в пространстве имен по умолчанию. В последнем случае второе выражение ничего не выбирает.

//a/@href и //*/a/@href

может выбирать различные наборы узлов, если верхний элемент документа - a, который имеет атрибут href. Атрибут href этого верхнего элемента выбирается первым выражением XPath, но не выбирается вторым, поскольку родительский элемент верхнего элемента не является элементом (это корневой узел /).

1 голос
/ 25 апреля 2011

Вы не показали исходный документ. Но я готов поспорить, что вы допустили ошибку # 1 XSLT, которая заключается в том, что вы забыли или не заметили, что он объявляет пространство имен по умолчанию, что означает, что имя без префикса, такое как // a, не выберет никаких элементов.

0 голосов
/ 24 апреля 2011

Если вы хотите выбрать узел с атрибутом, используйте этот синтаксис: //a[@href]. Я не совсем уверен, почему другой метод не работает, поскольку это имеет смысл в принципе. Я думаю, насколько XPath.

...