Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP检索XML元素数据_Php_Xml_Xpath - Fatal编程技术网

用PHP检索XML元素数据

用PHP检索XML元素数据,php,xml,xpath,Php,Xml,Xpath,我试图允许用户检索特定的XML节点并打印信息。我的XML数据如下所示: <people> <person id="1"> <forename>Jim</forename> <surname>Morrison</surname> </person> <person id="2"> <forename>James</forena

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

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

从这一点开始,我不确定如何继续,我已经研究了SimpleXML和XPATH,但我不确定如何使用它们来实现这一点。如果您能帮助

找出解决此问题的主要方法,将不胜感激:

    $xml=simplexml_load_file("credentials.xml") or die("Error: Cannot create object");
    foreach($xml->children() as $people){ 
     if ($people->forename == "james" ){echo $people->forename;}
    }
这可能效率低下,因此如果其他人有更好的方法,请指定:)

您应该使用

返回一个对象

从这里,您可以使用objects方法来获取所需的子对象,这些子对象也将是更多的SimpleXMLElement对象。让我们假设你首先想要孩子们叫人,然后想要人。获取person对象后,可以通过获取名称和值等的方法获取属性值。因为SimpleXMLElement实现了,所以可以使用循环来循环返回的列表/数组。

让我们
xpath()

上面的xpath表达式将选择任何将“James”作为
,并将其作为数组存储在
$result

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

我们也可以写下同样的结果:

$result = $xml->xpath("/people/person[forename = 'James']");
$result = $result[0];
如果XML中有超过1个James,我们只会得到第一个。 要获得所有果酱,请按照上面第1行的操作

然后,让我们输出xpath表达式选择的

echo $result->forename . ' ' . $result->surname .' has id ' . $result['id'] . ".";
如果
$result
包含多个jamese,请执行以下操作:

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

查看它是否有效:

这是一个很好的建议,我使用DOM实现了一个有效的问题解决方案,但我认为这比我的结果要好,所以我将尝试使用它,非常感谢。@LucasHolmes很高兴我能帮上忙。例如,您可以使用正则表达式(PCRE库,默认情况下应该启用)编写自己的解释器。您也可以自己解析整个文本,只需遍历每个字符并检测模式。
echo $result->forename . ' ' . $result->surname .' has id ' . $result['id'] . ".";
foreach ($result as $person) {
    echo $person->forename . ' ' . $person->surname .' has id ' . $person['id'] . "." . PHP_EOL;
}