我有一个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<dc>
<category>
<name>Personal Information</name>
<type>
<name>Age or Range</name>
<item dc-numeric="1">Record 1</item>
<item dc-numeric="2">Record 2</item>
<item dc-numeric="3">Record 3</item>
</type>
<type>
<name>Preferences</name>
<item dc-numeric="1">Record 1</item>
<item dc-numeric="2">Record 2</item>
<item dc-numeric="3">Record 3</item>
</type>
</category>
<category>
<name>Product Information</name>
<type>
<name>Intellectual Property</name>
<item dc-numeric="1">Record 1</item>
<item dc-numeric="2">Record 2</item>
<item dc-numeric="3">Record 3</item>
</type>
</category>
<category>
<name>Business Information</name>
<type>
<name>Business Records</name>
<item dc-numeric="1">Record 1</item>
<item dc-numeric="2">Record 2</item>
<item dc-numeric="3">Record 3</item>
</type>
</category>
</dc>
我使用PHP foreach
解析文件,但是next()
函数出现问题:
<?php foreach ($xml as $category) : ?>
<?php echo $category->name; ?>
<br /><li><?php prev($category); ?> | <?php next($category); ?></li>
<?php endforeach; ?>
我正在尝试获取以下输出以显示XML中的上一个/下一个categories->name
:
个人信息
产品信息
答案 0 :(得分:1)
Xpath允许您使用表达式来获取DOM的一部分(SimpleXML基于DOM)。
它有上下文和轴的概念。默认轴为child
- 节点的子节点。在这种情况下,preceding-sibling
和following-sibling
就是您所需要的。 [1]
是由其前面的位置路径描述的列表中的第一个节点的条件。
以下是如何使用它们的一个小例子:
$dc = new SimpleXMLElement($xml);
foreach ($dc->category as $category) {
$previous = $category->xpath('preceding-sibling::category[1]')[0];
$next = $category->xpath('following-sibling::category[1]')[0];
var_dump(
[
'current' => (string)$category->name,
'previous' => $previous instanceof SimpleXMLElement
? (string)$previous->name : null,
'next' => $next instanceof SimpleXMLElement
? (string)$next->name : null,
]
);
}
输出:
array(3) {
["current"]=>
string(20) "Personal Information"
["previous"]=>
NULL
["next"]=>
string(19) "Product Information"
}
array(3) {
["current"]=>
string(19) "Product Information"
["previous"]=>
string(20) "Personal Information"
["next"]=>
string(20) "Business Information"
}
array(3) {
["current"]=>
string(20) "Business Information"
["previous"]=>
string(19) "Product Information"
["next"]=>
NULL
}