2010-08-20 2 views
0

Я пытаюсь использовать XPath в PHP, и я получаю слишком много элементов. Это мой код:PHP XPath возвращает слишком много элементов

libxml_use_internal_errors(true); 
$document = new DOMDocument; 
$document->strictErrorChecking = false; 
$document->loadHTML($text); 
$xpath = new DomXPath($document); 
$placeholders = $xpath->query('//div[starts-with(@class, "waf-ph-")]'); 
print '$placeholders->length: ' . $placeholders->length; 

Существует только один элемент, соответствующий запросу. Один. Ни одного. Но вот мой результат:

$placeholders->length: 7 

Я использую loadHTML, потому что не будет иметь полный контроль над входом, когда я закончу кодирования, и я не могу гарантировать, соответствующий стандартам XHTML. Я намерен использовать Tidy, но я стараюсь не полагаться на него. Но есть только один div, который соответствует XPath.

Дальнейшие исследования показывают, что это тот же самый элемент, который был найден семь раз.

Что происходит?

Edit: источник файла DOM является HTML-файл, который где-то содержит следующее (это фиктивный адрес):

<div class="waf-ph-https\:\/\/aserver\.com\/apath\/app\.php5"> 
    <p class="notification">This is to be substituted.</p> 
</div> 

Строка «WAF-Ph-» встречается больше нигде в файл.

Edit:

Попытка следующее:

foreach ($document->placeholders as $node) print $document->saveXML($node); 

возвращает текст выше DIV в семь раз.

+1

Можете ли вы опубликовать короткий фрагмент XML, который демонстрирует ошибку? – ircmaxell

+1

Этот «тот же самый элемент» найден в 7 разных местах в документе XML? –

+2

И каковы другие 7 результатов, которые он нашел, что «не должно быть»? – ircmaxell

ответ

0

ircmxaell Комментарий об использовании spl_object_hash() действительно решить мою проблему и показал, что, на этот раз, компилятор (или интерпретатор) действительно был виноват. Он должен получить кредит на этот вопрос. Короче говоря, я пишу этот ответ, чтобы отблагодарить его.

1

Если я использую фрагмент, который вы даете, я получаю один результат.

Для этого XML:

$text = <<< XML 
<root> 
    <div class="waf-ph-1"></div> 
    <div class="waf-ph-2"></div> 
    <div class="waf-ph-3"></div> 
    <div class="waf-ph-4"></div> 
</root> 
XML; 

вы получите четыре матча для данного XPath.

Для этого XML:

$text = <<< XML 
<root> 
    <div class="waf-ph-1"></div> 
    <div class="wbf-ph-2"></div> 
    <div class="wcf-ph-3"></div> 
    <div class="wdf-ph-4"></div> 
</root> 
XML; 

вы получите только один. Ваш код верен. Это должен быть ваш HTML. Также обратите внимание, что //div будет соответствовать любому <div> независимо от его позиции в документе. Следующий XML также возвращает 4 найденные узлы для вашего кода:

$text = <<< XML 
<root> 
    <div class="waf-ph-1"> 
     <div class="waf-ph-2"> 
      <div class="waf-ph-3"> 
       <div class="waf-ph-4"> 
    </div></div></div></div> 
</root> 
XML; 
+0

То, что вы описали, именно то, что должен был найти мой код. Спасибо, что сообщили мне, что мой код верен. Я сходил с ума! Тогда я не уверен, что случилось. («Это никогда не компилятор. Ну, почти никогда».) Проходит Tidy ... Я посмотрю, что Tidy дублирует мой div. Хотя я не понимаю, почему. Мне очень сложно и долго менять исходный файл HTML на XPath: он на ограниченной части сервера, поэтому я просто принял как должное, мой код был чем-то неправильным. Наверное, тогда я посмотрю на Тиди. Даже если HTML преобразуется в XML, это вряд ли будет ТАКОЙ далеко, не так ли? – eje211

+0

@ eje211 @ircmaxell дал большое предложение в комментариях ниже вашего вопроса: вывести найденные узлы. Сделайте 'foreach ($ placeholders как $ node) {echo $ document-> saveXml ($ node); } ', чтобы распечатать XML, чтобы узнать, что он нашел. Или просто выведите весь документ, чтобы узнать, что из него сделал DOM. – Gordon

+0

Я не думал делать saveXML. Я думал о print_r, это не очень полезно. Виноват. Я сделаю это прямо сейчас. – eje211

Смежные вопросы