6

有没有办法我可以使用 SimpleXML 获得特定项目?

例如,我想使用此示例 xml 获取 ID 设置为 12437 的项目的标题:

<items>
  <item>
    <title>blah blah 43534</title>
    <id>43534</id>
  </item>
  <item>
    <title>blah blah 12437</title>
    <id>12437</id>
  </item>
  <item>
    <title>blah blah 7868</title>
    <id>7868</id>
  </item>
</items>
4

2 回答 2

10

这里有两种简单的方法来做你想做的事,一种是像这样迭代每个项目:

<?php
$str = <<<XML
<items>
<item>
<title>blah blah 43534</title>
<id>43534</id>
</item>
<item>
<title>blah blah 12437</title>
<id>12437</id>
</item>
<item>
<title>blah blah 7868</title>
<id>7868</id>
</item>
</items>
XML;

$data = new SimpleXMLElement($str);
foreach ($data->item as $item)
{
    if ($item->id == 12437)
    {
        echo "ID: " . $item->id . "\n";
        echo "Title: " . $item->title . "\n";
    }
}

现场演示。

另一种方法是使用 XPath 来精确定位您想要的确切数据,如下所示:

<?php
$str = <<<XML
<items>
<item>
<title>blah blah 43534</title>
<id>43534</id>
</item>
<item>
<title>blah blah 12437</title>
<id>12437</id>
</item>
<item>
<title>blah blah 7868</title>
<id>7868</id>
</item>
</items>
XML;

$data = new SimpleXMLElement($str);
// Here we find the element id = 12437 and get it's parent
$nodes = $data->xpath('//items/item/id[.="12437"]/parent::*');
$result = $nodes[0];
echo "ID: " . $result->id . "\n";
echo "Title: " . $result->title . "\n";

现场演示。

于 2013-07-09T00:42:05.933 回答
6

您想为此使用 Xpath。它与SimpleXML中概述的基本完全相同:选择具有特定属性值的元素,但在您的情况下,您不是在决定属性值,而是在元素值上。

但是在 Xpath 中,您要查找的两个元素都是父元素。因此,制定 xpath 表达式有点简单:

// Here we find the item element that has the child <id> element
//   with node-value "12437".

list($result) = $data->xpath('(//items/item[id = "12437"])[1]');
$result->asXML('php://output');

输出(美化):

<item>
  <title>title of 12437</title>
  <id>12437</id>
</item>

所以让我们再次看看这个 xpath 查询的核心:

//items/item[id = "12437"]

它被写成:选择作为<item>任何元素的子元素的所有元素,这些<items>元素本身具有以<id>value命名的子元素"12437"

现在有了周围缺少的东西:

(//items/item[id = "12437"])[1]

周围的括号说:从所有这些<item>元素中,只选择第一个。根据您的结构,这可能是必要的,也可能不是必要的。

所以这里是完整的使用示例和在线演示

<?php
/**
 * php simplexml get a specific item based on the value of a field
 * @lin https://stackoverflow.com/q/17537909/367456
 */
$str = <<<XML
<items>
  <item>
    <title>title of 43534</title>
    <id>43534</id>
  </item>
  <item>
    <title>title of 12437</title>
    <id>12437</id>
  </item>
  <item>
    <title>title of 7868</title>
    <id>7868</id>
  </item>
</items>
XML;

$data = new SimpleXMLElement($str);

// Here we find the item element that has the child <id> element
//   with node-value "12437".

list($result) = $data->xpath('(//items/item[id = "12437"])[1]');
$result->asXML('php://output');

因此,您在问题标题中所说的字段在本书中是子元素。在搜索更复杂的 xpath 查询时请记住这一点,这些查询可以为您提供所需的内容。

于 2013-07-09T08:37:01.010 回答