2017-01-07 2 views
1

일부 사용자에 대한 정보로 XML 파일을 구문 분석하려고합니다. 나는이 XML 내부의 모든 사용자를 추출하는 DOMXpath을 사용하고이PHP에서 DOMXPath를 사용하여 특정 컨텍스트의 요소를 찾는 방법은 무엇입니까?

users.xml에서

<?xml version="1.0" encoding="UTF-8"?> 
<users> 
    <user> 
     <name>Alexander</name> 
     <email>[email protected]</email> 
    </user> 
    <user> 
     <name>Tyler</name> 
     <email>[email protected]</email> 
    </user> 
</users> 

비슷해,이 모든 필드. XML 파일에 , 나는 15 사용자를 가지고 있고이 코드

$username = $xpath->query ('//email', $users->item(0)); 

한 사용자에 대한 모든 필드를 검색 할 때 나는 query 모든 XML에서 검색 대신을 찾고 의미의 길이가 15, 대신 1을 얻었다 실제 사용자. 내가 뭘 잘못하고있어?

xml_query.php

$xml = new DOMDocument(); 
$xml->loadXML($xml_content); 
$xpath = new DOMXPath($xml); 

$users = $xpath->query('//user'); 
var_dump($users->item(0)); 
$username = $xpath->query ('//email', $users->item(0)); 

var_dump($username); 
+0

'DOMXPath' 인수가해야 유형이 아닌 XML

XPath 식은 출력에 당신이 뭔가를 할 수있는 위치로 이메일을 조건 있도록 포함 할 수 있습니다 파일. – Mohammad

+0

코드에서 두 레인을 놓쳤습니다. DOMXPath는 생성자에 DOMDocument가 있습니다. @Mohammad –

+0

'// //'전자 메일에서'// '를 제거하십시오. –

답변

1

//email이 문서의 모든 요소를 ​​선택하지만 현재 컨텍스트 내에서 요소를 선택해야하기 때문에. 쿼리 표현식에서 //을 제거하십시오. demo

+0

'email'이 이제'length'가됩니다. –

1

추가 위치 경로의 시작에서 슬래시 (/)는 문서 노드는 상대적으로 만든다

$username = $xpath->query ('email', $users->item(0)); 

초래할 참조. 컨텍스트 노드는 무시됩니다. 다른 슬래시가 따라 오면 하위 축을 사용합니다. //email/descendant::email의 약어입니다. 기본 축은 child입니다.

$xml = <<<'XML' 
<?xml version="1.0" encoding="UTF-8"?> 
<users> 
    <user> 
     <name>Alexander</name> 
     <email>[email protected]</email> 
    </user> 
    <user> 
     <name>Tyler</name> 
     <email>[email protected]</email> 
    </user> 
</users> 
XML; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 
foreach ($xpath->evaluate('//user') as $user) { 
    var_dump($xpath->evaluate('string(email)', $user)); 
} 

출력 :

string(18) "[email protected]" 
string(14) "[email protected]" 

DOMXpath::evaluate() 표현식에 따라 노드 목록 또는 스칼라를 반환 할 수 있습니다. Xpath 표현식에서 노드를 문자열로 직접 형변환 할 수 있습니다.

foreach ($xpath->evaluate('//user[2]') as $user) { 
    var_dump($xpath->evaluate('string(email)', $user)); 
} 

출력 : DOMDocument``의

string(14) "[email protected]"