next()元素SimpleXML

时间:2016-12-13 00:31:00

标签: php xml simplexml

我有一个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

个人信息

  • 产品信息

产品信息

  • 个人信息|商业信息

1 个答案:

答案 0 :(得分:1)

Xpath允许您使用表达式来获取DOM的一部分(SimpleXML基于DOM)。

它有上下文和轴的概念。默认轴为child - 节点的子节点。在这种情况下,preceding-siblingfollowing-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
}