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

必要なことを行う 2 つの簡単な方法を次に示します。1 つは、次のように各項目を反復処理することです。

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

ライブデモ。

もう1つは、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>"12437"

そして今、不足しているものがあります:

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

かっこで囲まれている内容: これらすべての<item>要素から、最初の 1 つだけを選択してください。構造によっては、これが必要な場合とそうでない場合があります。

したがって、完全な使用例とオンラインデモは次のとおりです。

<?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 に答える