2012-09-11 2 views
0

XML의 각 노드에 물을 줄 수 있고 특정 사용자 이름을 찾을 때 해당 노드의 모든 데이터를 읽으 려합니다. 예를 들어PHP를 사용하여 XML에서 특정 이름을 검색하는 방법

:

나도 같은 노드에서 서버를 얻을 다음 사용자 이름 = 관리자를 찾을 수 및 필요
<Users> 
    <User> 
     <Username>admin</Username> 
     <Server>10.x.x.x</Server> 
    </User> 
    <User> 
     <Username>test</Username> 
     <Server>11.x.x.x</Server> 
    </User> 
</Users> 

. PHP를 사용하게되며 두 변수를 저장하여 예제를 만들 수 있습니다.

$input = '<Users> 
    <User> 
     <Username>admin</Username> 
     <Server>10.x.x.x</Server> 
    </User> 
    <User> 
     <Username>test</Username> 
     <Server>11.x.x.x</Server> 
    </User> 
</Users>'; 

$xml = new SimpleXMLElement($input); 

$result = $xml->xpath('/Users/User[Username="admin"]'); 
// Process $result to your liking.. 

내가 SimpleXMLElement를 사용했습니다 편의상 :

+0

확인 [DOMXPath] (http://www.php.net/manual/ en/class.domxpath.php). 이렇게하면 문서에서 XPath 쿼리를 수행 할 수 있습니다. – Michael

+0

링크를 가져 주셔서 감사합니다. 그러나이 예제를 통해 알아낼 수 없었습니다. –

답변

3

:

$doc = new DOMDocument; 
$doc->loadXML($xml); // Your xml string 
$xpath = new DOMXpath($doc); 

$query = '//Users/User/Username[. = "admin"]'; // Looking for user admin 
$entries = $xpath->query($query); 

foreach ($entries as $entry) { 
    //Getting the "server" node value for "admin" user 
    echo $entry->nextSibling->nextSibling->nodeValue; // Display 10.x.x.x 
} 
+0

그래서 형제가 둘 이상인 경우이 줄을 한 번만 더 사용할 수 있습니까? 'echo $ entry-> nextSibling-> nextSibling-> nodeValue;''admin '대신 PHP 변수를 삽입하는 방법 –

+0

5 초 동안 DomDocument에 대한 PHP 문서를 읽으면로드 할 수있는 load() 메소드가 있습니다. 문자열 대신 파일 ... – grunk

+0

한 가지 말씀해 주시겠습니까? 그 XML의 다음 형제를 읽고 싶을 때 "SERVER"라는 이름을 가진 노드가 한 개 더 있습니다. 어떻게해야합니까? 'foreach ($ entries as $ entries) { // "서버"노드 값 얻기 $ server = $ entry-> nextSibling-> nextSibling-> nodeValue; \t $ image = $ entry-> nextSibling-> nextSibling-> nextSibling-> nodeValue; }'마지막 노드 값에 첫 번째 값만 부여하지 않습니다. –

0

는이 라인을 따라 뭔가를하려고합니다. 보다 강력한 도구가 필요한 경우 DomDocument 및 DOMXPath을 살펴보십시오.

SimpleXML에 대한 자세한 내용 Xpath. 이 같은 트릭해야 XpathDomDocument를 사용

+0

아마 저를 올바르게 이해하지 못했을 수 있습니다. ' '노드의 각 물결표를 반복 할 필요가 있습니다. 예를 들어 사용자 이름이'admin'이고 그 사용자가 존재하면'server' 이름을 읽으십시오. –

+0

XPath가 의미 한 것을 이해했습니다. 니가 뭘했는지. – Coreus

1

이 변형 작동을

$dom = new DOMDocument(); 
$dom->preserveWhiteSpace = false; 
$dom->loadXML(file_get_contents('xpath.xml')); 
$xpath = new DOMXPath($dom); 
$query = '//Users/User/Username[text()="admin"]/following-sibling::Server'; 
echo $xpath->query($query)->item(0)->nodeValue; 
관련 문제