xml扩展 PHP的simplexml得到一个特定的项目基于一个字段的值




simplexmlelement to string (2)

有没有一种方法可以使用SimpleXML获取特定项目?

例如,我想获得一个ID为12437的项目的标题与这个例子的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>

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

然而,在Xpath中,你正在寻找的元素是parent.So表达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>的子元素,其值为"12437"

现在随着周围的缺失的东西:

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

圆括号说:从所有这些<item>元素,只挑第一个。 根据你的结构,这可能或可能不是必要的。

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

<?php
/**
 * php simplexml get a specific item based on the value of a field
 * @lin https://.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查询,让你找到你想要的。


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

<?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";

现场演示。







simplexml