2011-01-24 26 views
3

との値が、私は次のようなXMLスキーマを持っています。 Ex。取得要素名は、/ XML/Xpathの/ PHP

$userInfo = $doc->getElementsByTagName("user"); 
foreach($userInfo as $row) 
{ 
     $first_name = $row->getElementsByTagName("first_name"); 
} 

電話番号を選択するためにこれをネストしようとするとエラーが発生します。私は、同じ問題を持つ電話番号を選択するためにXPathを使用しようとしました。私は

$userInfo = $doc->getElementsByTagName("user"); 
foreach($userInfo as $row) 
{ 
     $phoneInfo = $row->getElementsByTagName("phone_numbers"); 
     foreach($phoneInfo as $row2) 
     { 
      $work = $row2->getElementsByTagName("work"); 
     } 
} 

の線に沿って何かをしようとしたイムイムは、どのようにこの進行を取得する根本的に間違っている、または何かをやっている場合好奇心。私は数時間のうちに私の髪を引き裂いています。

+0

私のために働く!どのPHPを使用していますか? –

+0

'getElementsByTagName'は' DOMNodeList'を返します。 foreachを使用してiterateできることは確かですか? (ただ質問する) – Jonas

+1

問題のXPathの使用法はありません。返信 –

答えて

3

、これを試してみてください。

$userInfo = $doc->getElementsByTagName("user"); 
foreach($userInfo as $row) 
{ 
     $phoneInfo = $row->getElementsByTagName("phone_numbers"); 
     foreach($phoneInfo as $row2) 
     { 
      // get the value from the first child 
      $work = $row2->getElementsByTagName("work")->item(0)->nodeValue; 
      $home = $row2->getElementsByTagName("home")->item(0)->nodeValue; 
     } 
} 
+3

私は今あなたの口にあなたにキスしたいです。それは魅力のように働いた。私はそれがとても簡単なときにそれを愛する/憎む。 – DaOgre

1

さて、あなたは簡単にパースのこのタイプになりSimpleXmlに切り替えできます。DOMDOCUMENTで、

$userInfo = $doc->getElementsByTagName("user"); 
foreach ($userInfo as $user) { 
    $node = simplexml_import_dom($user); 
    $id = (string) $node['id']; 
    $first = (string) $node->first_name; 
    $last = (string) $node->last_name; 
    $workPhone = (string) $node->phone_numbers->work; 
    $homePhone = (string) $node->phone_numbers->home; 
} 

今、あなたはDomXpathを使用してこれを行うことができます:それ

$userInfo = $doc->getElementsByTagName("user"); 
$xpath = new DomXpath($doc); 
foreach ($userInfo as $user) { 
    $id = $user->getAttribute('id'); 
    $first = $xpath->query('//first_name', $user)->item(0)->textContent; 
    $last = $xpath->query('//last_name', $user)->item(0)->textContent; 
    $work = $xpath->query('//phone_numbers/work', $user)->item(0)->textContent; 
    $home = $xpath->query('//phone_numbers/home', $user)->item(0)->textContent; 
} 

注意を上記のコード(両方の部分)では、形式が正確に必要です。あなたは条件文を持っている場合、あなたはこのような何か(のみfirstname条件)に変更する場合があります:あなたはのDOMNodeListオブジェクトから直接値を取得することはできません

$userInfo = $doc->getElementsByTagName("user"); 
$xpath = new DomXpath($doc); 
foreach ($userInfo as $user) { 
    $id = $user->getAttribute('id'); 
    $firstQuery = $xpath->query('//first_name', $user); 
    if ($firstQuery->length > 0) { 
     $first = $firstQuery->item(0)->textContent; 
    } else { 
     $first = ''; 
    } 
} 
+0

ここで言及したように私はDomXpathを使用しようとしていましたが、問題は私が電話番号に関連付けられていたユーザーを区別することでした。 $ userInfoから返されたオブジェクトの上にxpathを使用するように見えますが、私はそれを考えていませんでした。もう一方の答えは、私が必要とするものにもっと近づきますが、これは本当にしっかりしています。時間をかけて助けてくれてありがとう、ありがとう、もう一度xpathを掘り下げるときに、私はこれを使うつもりだ。 – DaOgre

関連する問題