web-dev-qa-db-ja.com

SimpleXML:特定の属性値を持つ要素の選択

XMLドキュメントで、同じ名前を共有する要素がありますが、属性の値はそれがどのタイプのデータであるかを定義し、ドキュメントから特定の値を持つ要素をすべて選択したいと思います。 XPathを使用する必要がありますか(使用している場合は、正しい構文を提案できますか)、それともよりエレガントなソリューションがありますか?

次に、XMLの例をいくつか示します。

<object>
  <data type="me">myname</data>
  <data type="you">yourname</data>
  <data type="me">myothername</data>
</object>

そして、タイプがmeである<data>のすべての<object>タグの子のコンテンツを選択します。

PS-私はPHPを使用してNetflix APIとインターフェイスしようとしています-これは私の質問には関係ないはずですが、そうするために良い/より良い方法を提案したい場合は、 mすべての耳。

31
dimo414

このXPathを試してください:

/object/data[@type="me"]

そう:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]');

また、objectがドキュメントのルートでない場合は、代わりに//object/data[@type="me"]を使用してください。

47
Gumbo

これを行うための関数を作成しました。ただし、最初の結果のみを取得します。あなたのマイレージは異なる場合があります。

function query_attribute($xmlNode, $attr_name, $attr_value) {
  foreach($xmlNode as $node) { 
    switch($node[$attr_name]) {
      case $attr_value:
        return $node;
    }
  }
}

使用法:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name;

(以下のXMLの場合)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root>
4
willbradley