2011-01-24 133 views
3

價值觀我有如下所示的XML模式:獲取元素的名稱/使用XML /的XPath/PHP

<xml> 
    <user id="1"> 
    <first_name>Bill</first_name> 
    <last_name>Steve</last_name> 
    <phone_numbers> 
     <work>xxx-xxx-xxxx</work> 
     <home>xxx-xxx-xxxx</home> 
    </phone_numbers> 
    </user> 
    <user id="2"> 
     ........ 
    </user> 
</xml> 

IM在使用DOM分析所有這些信息到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? – 2011-01-24 21:18:26

+0

`getElementsByTagName`返回`DOMNodeList`。你確定你可以使用foreach來遍歷嗎? (只是問) – Jonas 2011-01-24 21:19:21

+1

有沒有問題的XPath用法。重新標記 – 2011-01-24 22:46:01

回答

3

你不能從一個的DOMNodeList對象直接獲取的價值,試試這個:

$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; 
     } 
} 
1

嗯,你可以切換到SimpleXml這使得這種類型的分析更容易的:現在

$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; 
} 

,在的DomDocument,您可以通過使用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條件):

$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 = ''; 
    } 
}