2016-12-07 5 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 

Я не могу достать jobId16957.

Что мне нужно делать?

+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" 

Примечания

Вам не нужно указывать Root в выражении XPath, если вы собираетесь получать все profesionalData/jobId теги независимо от того, где они находятся в документе, просто используйте выражение с двойной косой чертой (//). Такой подход может быть удобным в тех случаях, когда вы хотите избежать регистрации пространств имен XML. В противном случае вы можете использовать строчное выражение, например /Root/profesionalData/jobId (путь от корня). Кстати, ваше текущее выражение (//Root/profesionalData/jobId) соответствует всем вхождениям /Root/profesionalData/jobId в документе, например. /x/y/z/Root/profesionalData/jobId.

С SimpleXmlElement::xpath функция возвращает массив при успешном завершении, или FALSE при ошибке, вы должны перебирать значение с помощью цикла, если это непустой массив.

SimpleXmlElement инвентарь __toString способ. Метод вызывается, когда объект появляется в контексте строки. В частности, вы можете указать объект в строку, чтобы получить строковое содержимое узла.

+0

Er .. Это всегда будет терпеть неудачу из-за вашего' if'! –

+1

@PraveenKumar, спасибо. исправлено –

+0

Первое примечание неверно. '//' не указывает на элемент «Root», но это ссылка на его родительский узел (в данном случае). Параметр '/' в начале пути местоположения указывает на сам документ, '//' - ось потомка. Таким образом, '// Root/profesionalData' будет искать любой элемент элемента profesionalData', который является прямым дочерним элементом узла элемента Root. – ThW

Смежные вопросы