使用PHP检索XML元素数据

时间:2014-11-16 14:29:41

标签: php xml xpath

我试图让用户检索特定的XML节点并打印信息。我的XML数据如下:

   <people>
    <person id="1">
     <forename>Jim</forename>
     <surname>Morrison</surname>
    </person>
    <person id="2">
     <forename>James</forename>
     <surname>Frank</surname>
    </person>
   </people>

我希望能够使用名称或ID搜索我的XML文档,例如我希望能够说,检查詹姆斯是否存在,如果詹姆斯存在,则打印出他的信息,否则打印输出错误消息&#39;。 我发现我首先需要将文件包含在:

    $xml=simplexml_load_file("credentials.xml") or die("Error: Cannot create object");

从这一点开始,我不确定如何继续,我已经看过SimpleXML和XPATH,但我不确定如何使用这些来实现这一点。谢谢,如果你能提供帮助

3 个答案:

答案 0 :(得分:1)

您应该使用manual

simplexml_load_file会返回SimpleXMLElement个对象。

从这里你可以使用对象children方法来获取你想要的孩子,这也是SimpleXMLElement对象的更多。让我们说你首先想要孩子们叫人,然后想要人。获得person对象后,可以通过方法attributes获取属性的值以获取名称和值等。因为SimpleXMLElement实现Traversable,所以可以使用foreach循环遍历你得到的列表/数组。

答案 1 :(得分:1)

让我们xpath()

$xml = simplexml_load_string($x); // assume XML in $x
$result = $xml->xpath("/people/person[forename = 'James']")[0];

上面的xpath-expression将选择任何<person>拥有&#39; James&#39;作为<forename>并将其存储为$result中的数组。

在第2行末尾的[0],我们只选择该数组中的第一个条目并将其存储在$result中。这需要PHP&gt; = 5.4。

我们也可以写以获得相同的结果:

$result = $xml->xpath("/people/person[forename = 'James']");
$result = $result[0];

如果XML中有超过1个James,我们只会得到第一个。 要获得所有Jameses,请按照上面的第1行进行操作。

然后,让我们输出由xpath表达式选择的<person>

echo $result->forename . ' ' . $result->surname .' has id ' . $result['id'] . ".";

如果$result包含多个Jameses,请执行:

foreach ($result as $person) {
    echo $person->forename . ' ' . $person->surname .' has id ' . $person['id'] . "." . PHP_EOL;
}

看到它有效:https://eval.in/222195

答案 2 :(得分:0)

弄清楚如何解决这个问题:

    $xml=simplexml_load_file("credentials.xml") or die("Error: Cannot create object");
    foreach($xml->children() as $people){ 
     if ($people->forename == "james" ){echo $people->forename;}
    }

这可能效率低下,所以如果其他人有更好的方法请指定:)