XPath не возвращает значения с кавычками - PullRequest
0 голосов
/ 12 марта 2011
<html>

<body>

<channel>


<item>

<link>"http://www.example.com/"
</link>

<title>This is a title
</title>

</item>

<item>

<link>"http://www.example2.com/"
</link>

<title>This a 2nd title
</title>

</item>

</channel>

</body>

</html>

$query = '/html/body/channel/item/title';

$xpath->query($query);

$i = 0;

foreach ( $xpath->query($query) as $key )
{   
    echo '<p>'.$xpath->query($query) -> item($i) -> nodeValue . '</p><br />';

    $i++;
}

Я пробовал следующие запросы:

$query = '/html/body/channel/item/link';

и

$query = '/html/body/channel/item/link/text()';

Я могу вернуть <item> и <title> просто отлично. Просто не <link>. Я что-то упускаю?

1 Ответ

0 голосов
/ 12 марта 2011

Ваш код не работает и не имеет смысла

1 $query = '/html/body/channel/item/title';
2 $xpath->query($query);
3 $i = 0;
4 foreach ($xpath->query($query) as $key)
5 {   
6     echo '<p>'.$xpath->query($query) -> item($i) -> nodeValue . '</p><br />';
7     $i++;
8 }

будет запрашивать элементы заголовка (2), но поскольку результат не назначен, он является излишним.Затем вы делаете foreach и запрашиваете снова (4).На этот раз вы назначаете каждому заголовку DOMElement $ key (что неверно в imo).В foreach вы делаете еще один запрос для элементов title (6) и извлекаете элементы items / title из него из переменной counter (3/6).Это также излишне, потому что у вас уже есть этот элемент в $ key (3).Таким образом, вы делаете три одинаковых запроса, где вам нужен только один, и вы делаете foreach, не используя его.

Это должно быть

foreach ($xpath->query('/html/body/channel/item/title') as $titleElement) {
    printf('<p>%s</p>', $titleElement->nodeValue);
}

Поскольку вы уже используете DOM для работы с разметкойВы также можете создать элемент p с ним вместо использования конкатенации строк, например

foreach ($xpath->query('/html/body/channel/item/title') as $titleElement) {
    echo $domDocument->saveXml(
        $domDocument->createElement('p', $titleElement->nodeValue)
    );
}

Если вы хотите, чтобы элементы ссылки были изменены, измените XPath, чтобы запросить его вместо заголовка.Кавычки в значении узла не имеют к этому никакого отношения.Они покажутся просто отлично.

Полный рабочий пример, показывающий, как объединить элементы <title> и <link> в <a> элементы

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