2014-10-26 3 views
0

У меня есть тестовый файл, где я пытаюсь проанализировать строку xml с использованием метода xpath SimpleXML.xml xpath не возвращает значение узла

Когда я пытаюсь получить доступ к значениям узлов напрямую с помощью xpath, я получаю пустой вывод, но когда я использую xpath для захвата элементов, а затем прокручиваю их, он отлично работает.

Когда я смотрю документацию, мне кажется, что мой синтаксис должен работать. Есть что-то, что мне не хватает?

<?php 

$xmlstring = '<?xml version="1.0" encoding="iso-8859-1"?> 
<users> 
    <user> 
    <firstname>Sheila</firstname> 
    <surname>Green</surname> 
    <address>2 Good St</address> 
    <city>Campbelltown</city> 
    <country>Australia</country> 
    <contact> 
     <phone type="mobile">1234 1234</phone> 
     <url>http://example.com</url> 
     <email>[email protected]</email> 
    </contact> 
    </user> 
    <user> 
    <firstname>Bruce</firstname> 
    <surname>Smith</surname> 
    <address>1 Yakka St</address> 
    <city>Meekatharra</city> 
    <country>Australia</country> 
    <contact> 
     <phone type="landline">4444 4444</phone> 
     <url>http://yakka.example.com</url> 
     <email>[email protected]</email> 
    </contact> 
    </user> 
</users>'; 


// Start parsing 
if(!$xml = simplexml_load_string($xmlstring)){ 
    echo "Error loading string "; 
} else { 
    echo "<pre>"; 

    // Print all firstname values directly from xpath 
    // This outputs the elements, but the values are blank 
    print_r($xml->xpath("https://stackoverflow.com/users/user/firstname")); 

    // Set a variable with all of the user elements and then loop through and print firstname values 
    // This DOES output the values 
    $users = $xml->xpath("https://stackoverflow.com/users/user"); 
    foreach($users as $user){ 
     echo $user->firstname; 
    } 

    // Find all firstname values by tag 
    // This does not output the values 
    print_r($xml->xpath("//firstname")); 
    echo "</pre>"; 
} 
+0

Бит путать. Результаты возвращаются для всех трех ваших запросов. У вас просто проблемы с получением данных? – rjdown

ответ

0

В соответствии с ручным http://uk1.php.net/manual/en/simplexmlelement.xpath.php

Метод XPath ищет узел SimpleXML для детей совпадающих по пути XPath.

В первом и третьем примерах вы возвращаете объекты, содержащие массив значения узла, а не сам узел. Таким образом, вы не сможете это сделать, например.

$results = $xml->xpath("//firstname"); 
foreach ($results as $result) { 
    echo $result->firstname; 
} 

Вместо этого вы можете просто вывести значение напрямую. Ну, почти сразу (они все еще являются симплексными объектами в конце концов) ...

$results = $xml->xpath("//firstname"); 
foreach ($results as $result) { 
    echo $result->__toString(); 
} 
+0

А, ок. Я думал, что с помощью 'print_r' будут напечатаны дети и их значения. Я просто планирую разобрать то, что вы предлагаете. Благодаря! –

+0

Вы должны видеть что-то с print_r ... Я получаю это для вашего первого и третьего примеров: 'Array ([0] => SimpleXMLElement Object ([0] => Sheila) [1] => Объект SimpleXMLElement ([0] => Bruce)) ' – rjdown

+0

Интересно, я получал тот же результат, только у меня не было значений, где вы получаете имена. (Дополнительные два элемента здесь от более XML, что я обрезанного из описания StackOverflow): '( [0] => SimpleXMLElement Object ( ) [1] => SimpleXMLElement Object ( ) [ 2] => SimpleXMLElement Object ( ) [3] => SimpleXMLElement Object ( ) ) ' –

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