2009-06-14 26 views
30

XML文書では、同じ名前を持つ要素がありますが、属性の値によってそのデータの種類が定義されています。文書から一定の価値を持っています。 XPathを使用する必要がありますか(もしそうなら、正しい構文を提案することができますか)、より洗練されたソリューションがありますか?SimpleXML:特定の属性値を持つ要素を選択する

はここにいくつかの例のXMLです:

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

そして、私はタイプがmeあるのです<object>のすべて<data>タグの子の内容を選択します。

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

+0

X-REF(以下XML用):([XPathの状態を実装] http://stackoverflow.com/q/3448005/367456) – hakre

答えて

44

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

だから、
/object/data[@type="me"] 

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

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

+4

xpath文字列だけでなく、完全なラッピングphp行を含めていただきありがとうございます。 引用符が必要かどうか、xpath文字列のようなスコープについてのようなものについては、決して伝えることはできません。 文脈で物事を見ることは、あなたがすでにそれを知らないと推測できない重要な情報を提供します。 – ahnbizcad

4

私はこれを行うための機能を作成しました。それは最初の結果だけをつかむ。あなたのマイレージは異なる場合があります。

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; 

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root> 
+11

XPath Gumboを使用してみませんか?なぜ、if($ node [$ attr_name] == $ attr_value) 'を読みやすくするのではなく、スイッチを使うのですか? – dimo414

関連する問題