我试图让用户检索特定的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,但我不确定如何使用这些来实现这一点。谢谢,如果你能提供帮助
答案 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;}
}
这可能效率低下,所以如果其他人有更好的方法请指定:)