如何将 XML 转换为可以迭代的数组。
这是我的 XML 示例
<user>
<student>yes</student>
<id>1</id>
<name>John</name>
</user>
<user>
<student>yes</student>
<id>1</id>
<name>Billy</name>
</user>
我的 php 看起来像这样
$tmpTemplates = new XDomDocument();
$tmpTemplates->load('.....myFile.xml');
$xPath = new DomXPath($tmpTemplates);
$query = "//user[student='yes']";
$tmpTemplate = $xPath->query($query);
我想要做的是
foreach($tmpTemplate as $tt){
var_dump($tt->student);
var_dump($tt->id);
var_dump($tt->name);
}
现在我只能打印出nodeValue,它给了我这样的东西:
yes
1
John
如何将其设为数组或对象,以便可以通过键来获取每个值?
最佳答案
您在示例中对两条记录使用了相同的 id,因此我更改了第一个记录的 id 并添加了一个文档元素。
<users>
<user>
<student>yes</student>
<id>2</id>
<name>John</name>
</user>
<user>
<student>yes</student>
<id>1</id>
<name>Billy</name>
</user>
</users>
使用 DOMXpath:evaluate()
获取详细信息,第二个参数是表达式的上下文节点。
$document = new DOMDocument();
$document->loadXml($xmlString);
$xPath = new DomXPath($document);
$students = [];
foreach ($xPath->evaluate("//user[student='yes']") as $student) {
$id = $xPath->evaluate('string(id)', $student);
$students[$id] = [
'id' => $id,
'name' => $xPath->evaluate('string(name)', $student)
];
}
var_dump($students);
输出:
array(2) {
[2]=>
array(2) {
["id"]=>
string(1) "2"
["name"]=>
string(4) "John"
}
[1]=>
array(2) {
["id"]=>
string(1) "1"
["name"]=>
string(5) "Billy"
}
}
返回值取决于表达式。像 //user[student='yes']
或 name
这样的位置路径会返回 DOMNodeList
。但是您可以直接在 Xpath 中转换节点列表。 string(name)
将返回第一个 name
子节点的内容或空字符串。
关于PHP 迭代 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702790/