2012-12-07 3 views
2

for 루프 내의 현재 SimpleXMLElement 객체에서 Xpath 쿼리를 어떻게 실행합니까? 예를 들어,for 루프 내의 현재 SimpleXMLElement 객체에 대한 Xpath 쿼리

<?php 
$xml = simplexml_load_string('<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

<book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
</book> 

</bookstore> '); 


foreach ($xml as $value) { 
    $result = $value->xpath('//title'); 
    var_dump($result); 
    break; 
} 
?> 

array 
    0 => 
    object(SimpleXMLElement)[189] 
     public '@attributes' => 
     array 
      'lang' => string 'eng' (length=3) 
     string 'Harry Potter' (length=12) 
    1 => 
    object(SimpleXMLElement)[188] 
     public '@attributes' => 
     array 
      'lang' => string 'eng' (length=3) 
     string 'Learning XML' (length=12) 

이 결과는 두 개의 책 요소의 결과를 출력하지만, 첫 번째 요소 만 표시하려는 의도입니다. 나는 각 책마다 다른 쿼리를 실행할 수 있으므로 을 for 루프의 $ value 객체에서만 실행하려고 시도하고 있습니다 (루프에 있어야합니다!) 현재하고 있습니다.

답변

0

// 위치에 관계없이 선택 영역과 일치하는 현재 노드에서 문서의 노드를 선택합니다.

루트에서 모든 노드를 선택하는 쿼리를 실행했을 때 이미 필요한 노드 (예 : $ value)에 있었기 때문에 모든 노드에서 정보를 얻습니다.

필요한 노드 요소를 이미 제거 했으므로 // 현재 노드에서 쿼리를 실행하여 예상 결과를 얻습니다.

+0

// 현재 노드가 아닌 루트 노드에서 문서의 태그를 선택합니다. – Benjamin

4

.을 사용하여 현재 노드를 나타낼 수 있습니다. 따라서 ./FooFoo이라는 직계 하위를 선택하고 .//FooFoo이라는 하위 모든 하위를 선택합니다.

점이 없으면 //은 문서의 루트를 나타내는 것으로 간주되어 문서 전체에서 Foo이라는 항목을 선택합니다.