2016-12-07 6 views
0

나는 다음과 같은 XML이 :PHP SimpleXMLElement 객체에서는 데이터

<Root> 
    <personalData> 
     <userName>John Tom</userName> 
     <email>[email protected]</email> 
    </personalData> 
    <profesionalData> 
     <job>engineer</job> 
     <jobId>16957</jobId> 
    </profesionalData> 
</Root> 

내 디버거에서 수행 :

$myObject->xpath('//Root/profesionalData') 

내가 가진 :

: array = 
    0: object(SimpleXMLElement) = 
    job: string = engineer  
    jobId: string = 16957 

것은 내가 jobId의 보류를 얻을 수 없다 16957.

무엇을해야합니까?

+0

'$ myObject-> xpath ('// Root/profesionalData') [0] -> jobId' –

답변

1
$root = simplexml_load_file('file.xml'); 


$job_ids = $root->xpath('//profesionalData/jobId'); 

if (!$job_ids) { 
    die("Job IDs not found"); 
} 

foreach ($job_ids as $id) { 
    // SimpleXmlElement implements __toString method, so 
    // you can fetch the vlaue by casting the object to string. 
    $id = (string)$id; 
    var_dump($id); 
} 

샘플 출력

string(5) "16957" 

노트

모든 profesionalData/jobId 태그를 상관없이 어디를 가져가는 경우, XPath 식에 Root를 지정할 필요가 없습니다 그들은 문서에, 그냥 더블 슬래시 (//) 표현을 사용하고 있습니다. 이 방법은 XML 네임 스페이스를 등록하지 않으려는 경우에 편리 할 수 ​​있습니다. 그렇지 않으면 /Root/profesionalData/jobId (루트 경로)과 같은 엄격한 표현식을 사용할 수 있습니다. 그런데 현재 표현식 (//Root/profesionalData/jobId)은 문서에있는 /Root/profesionalData/jobId 번과 일치합니다 (예 : /x/y/z/Root/profesionalData/jobId.

SimpleXmlElement::xpath 함수가 성공하면 배열을 반환하고, 실패하면 FALSE을 반환하므로 비어 있지 않은 배열 인 경우 루프를 사용하여 값을 반복해야합니다.

SimpleXmlElement__toString 메소드를 구현합니다. 이 메서드는 객체가 문자열 컨텍스트에 나타날 때 호출됩니다. 특히 노드의 문자열 내용을 가져 오기 위해 cast 문자열에 대한 객체를 사용할 수 있습니다.

+0

Er .. 이렇게하면'if' 때문에 항상 실패합니다! –

+1

@PraveenKumar, 감사합니다. 고정 –

+0

첫번째 주 내용이 잘못되었습니다. '//'는 'Root'엘레멘트를 가리 키지 않지만 부모 노드 (이 경우)에 대한 참조이다. 위치 경로의 시작 부분에있는'/'는 문서 자체를 가리키고, '//'는 자손 축입니다. 그래서'// Root/profesionalData'는'Root' 요소 노드의 직접적인 자식 인'profesionalData' 요소 노드를 찾을 것입니다. – ThW