XPath Sibling возвращается пустым - PullRequest
0 голосов
/ 25 января 2020

Я использую http://www.xpathtester.com/xpath/5a30592045b6aa5089faf909261ede0b XPath-тестер, который возвращает именно то, что я хочу. По какой-то причине он удаляет мой полный запрос, но если вы используете его, он работает.

* / h3 [содержит (строка (), "Описание")] / следующего брата :: p [1]

Но в реальной жизни я получаю ничего из моей переменной.

Я пытаюсь получить данные после <h3>Description</h3>, в данном случае абзаца <p>.

HTML $ feed_item =

<div class="outer-feed"><ul>
<li><strong>Severity:</strong> <span class="label label-info">Low</span></li>
</ul>
<h3>Description</h3>
<p>The lack of validation of configuration parameters used in SQL queries caused various SQL injection vectors.</p>
...

Вот мои XPath

$description_node = $xpath->query('*/h3[contains(string(), "Description")]/following-sibling::p[1]', $feed_item);
$description = "description: " . $description_node->item(0)->textContent;

и var_dump

object(DOMNodeList)#1654 (1) { ["length"]=> int(0) }

И ошибка

Notice
: Trying to get property 'textContent' of non-object in

Меня смущает то, что Я могу получить уровень серьезности из того же HTML, используя это:

$severity_node = $xpath->query('*/li[contains(string(), "Severity:")]', $feed_item);
$severity = preg_replace('/Severity:\W*/u', '', $severity_node->item(0)->textContent);

Моя первая мысль было уменьшить масштаб до H3 и вывести это.

$description_node = $xpath->query('*/h3[contains(string(), "Description")]', $feed_item);
object(DOMNodeList)#1654 (1) { ["length"]=> int(0) } // doesn't contain anything

Учитывая, что следующее идентично, но первый работает, а второй нет, в чем может быть проблема?

$severity_node = $xpath->query('*/li[contains(string(), "Severity:")]', $feed_item);
$description_node = $xpath->query('*/h3[contains(string(), "Description")]', $feed_item);

Почему один работает, а не другой. И что является лучшим способом устранения неполадок, подобных этим. Кажется, работает на xpathtester. Что я могу делать не так, что вызывает эту проблему в PHP?

Ответы [ 2 ]

1 голос
/ 25 января 2020

Попробуйте с этим XPath:

//h3[text()="Description"]/following::p[1]
1 голос
/ 25 января 2020

Запрос, начинающийся с */h3[...], будет работать только в том случае, если элемент контекста, когда он вызывается, является прародителем элемента h3. Вы не предоставили никакой информации об элементе контекста, поэтому я подозреваю, что это нечто иное.

Вы задаете вопрос (-ы): «Почему один работает, а не другой. И как лучше всего это сделать? устранить неполадки, подобные этим. Кажется, что это работает на xpathtester. Что я мог сделать неправильно, что вызывает эту проблему в PHP? "

Ну, во-первых, нужно понять, что выражения XPath могут зависеть от элемент контекста, и что одно и то же выражение, оцененное с использованием различных элементов контекста, даст разные результаты. Как только вы поймете эту концепцию, надеюсь, она станет намного понятнее.

...