2015-01-17 2 views
1

Как запустить второй и третий запрос XPatch в запросе XPatch?
НапримерЗапрос XPath в запросе XPath

CodePad = http://codepad.viper-7.com/ZhMNGw

HTML КОД

<div class="entries">        
    <h3 class="headline" style="position: relative; cursor: pointer;"> 
     <div> 
      <a class="selink" href="/tste/?sd=28726585"> 
       <span class="date"> 10:15 </span> 
       <span class="titel">THE TITLE<span class="subtitel">some subtitle</span> 
       </span> 
      </a> 
     </div>        
    </h3> 
</div> 
<div class="entries">        
    <h3 class="headline" style="position: relative; cursor: pointer;"> 
     <div> 
      <a class="selink" href="/tste/?sd=287265995"> 
       <span class="date"> 10:16 </span> 
       <span class="titel">THE TITLE 2<span class="subtitel">some subtitle</span> 
       </span> 
      </a> 
     </div>        
    </h3> 
</div> 

PHP

libxml_use_internal_errors(true); 
$doc = new DOMDocument; 
$doc->preserveWhiteSpace = false; 
$doc->strictErrorChecking = false; 
$doc->recover = true; 
$doc->loadHTMLFile('http://domain.com/startpage.php'); 
$xpath = new DOMXPath($doc); 

$query = "//div[@class='entries']"; // <- QUERY ONE 

$entries = $xpath->query($query); 
$list = array(); 

$count = 0; 
foreach ($entries as $key => $value) 
{   
    $list[$count] = array(); 

    // get the link <- QUERY TWO 
    $list[$count]['url'] = $xpath->query("//a[@class='selink']"); 

    // get the title but NOT the subtitle <- QUERY THREE 
    $list[$count]['title'] = $xpath->query("//span[@class='titel']"); 


    $count++; 
} 


print_r($list); 

ответ

1

$ xpath-> запрос ($ выраж) выполняется на целая документация каждый вызов в цикле, потому что вы не проходите узел документа, запрос XPath следует оценивать относительно.

С помощью полиморфного метода DOMNodeList query(string $expr, DOMNode $node) вы можете сделать запрос на запрос относительно данного узла $. Этот метод дает желаемый результат, только если вы используете относительный XPath $ expr (без указания//). Для извлечения строки из каждого DOMNode/TextNode, наконец, использовать запросы следующим образом:

$list[$count]['url'] = $xpath->query("h3/div/a[@class='selink']/@href", $value)->item(0)->value; 
$list[$count]['title'] = $xpath->query("h3/div/a/span[@class='titel']/text()", $value)->item(0)->wholeText; 

Я редактировал свой код CodePad here.

приветствует, Макс.

+0

Я не понимаю. Можете ли вы изменить мою демо-версию кодека? http://codepad.viper-7.com/ZhMNGw – Peter

+0

Извините, я просто понял, что каждый запрос начинается с корня документа. Вместо этого вы должны использовать относительные подзапросы. Я скорректировал свой ответ соответственно. – mxg

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