2014-11-18 3 views
0

내가 특정 노드의 제품 이름과 이미지를 검색 할 다음과 같은 XML (ID)PHP의 XPath는 문제 -> 항목 (0) -> nodeValue를

<?xml version="1.0" encoding="utf-8"?> 
<clients> 
    <client id="A"> 
     <product>Name of product A</product> 
     <image>Product image name A</image> 
    </client> 
    <client id="B"> 
     <product>Name of product B</product> 
     <image>Product image name B</image> 
    </client> 
</clients> 

이것은 PHP 코드가 기준 자료 :

Name of product A 
Product image name A 

하지만 싶어 -> 제품 -

$doc  = DOMDocument::load('clients.xml'); 
$xpath = new DOMXPath($doc); 
$query = '//client[@id="A"]'; 
$info = $xpath->query($query); 

나는 $ info-을 할 경우> 항목 ​​(0)> nodeValue를 내가 함께가 아니라 개별적으로 정보를 모두 얻을 수 -> nodeValue 및 image-> nodeValue는 클라이언트 ID를 기반으로합니다. 어떻게하면됩니까? 예를 들어 $ info-> item (0) -> product-> nodeValue가 작동하지 않습니다.

-> 항목 (0) -> nodeValue를

답변

0

당신의 결과는 단일 노드 (클라이언트)를 반환합니다 (이 경우 0) 특정 항목 내부의 모든 것을 제공합니다. 그 노드의 nodevalue는 그 아래에있는 모든 텍스트입니다.

시도 : "// client [@ id = 'A']/* [name() = 'product'또는 name() = 'image']"두 노드를 반환합니다. 위치별로 사용하려면 이름을 확인하십시오.

1

XPath를 사용하여 노드를 가져옵니다. XPath 위치 경로의 결과는 노드 목록입니다. -> 항목 (0)은이 목록의 첫 번째 노드를 반환합니다. 이것은 client 요소 노드입니다.

DOMElement 호출 : $ nodeValue는 항상 모든 자손 텍스트 노드를 문자열로 반환합니다. 이 경우 productimage 요소 노드 안에 텍스트 노드가 있습니다.

값을 별도로 원하면 자식 노드를 가져와야합니다.

$dom = new DOMDocument(); 
$dom->loadXML($xml); 
$xpath = new DOMXpath($dom); 

foreach ($xpath->evaluate('//client[@id="A"]/*[self::product or self::image]') as $child) { 
    echo $child->localName, ': ', $child->nodeValue, "\n"; 
} 

출력 :

product: Name of product A 
image: Product image name A