PHP 迭代 XML

标签 php xml xpath

如何将 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/

相关文章:

java - 检索不同的子元素xml

xml - xpath/xslt 来确定上下文节点相对于所有同名节点的索引?

php - 如何合并 MySQL 表中的两条冗余记录,维护所有 PK/FK 关系?

javascript - 如何使用 Codeigniter 从数据库填充下拉列表

php - 如何使用 php 设置 crontab?

xml - XSLT 中的 If 条件

c# - 查找没有根元素的节点值

java - Xpath是正确的仍然没有得到这样的元素: Unable to locate element

xml - 引用 XML 数据库文件

更新 mysql 表时 PHP 错误