2011-01-24 75 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 = ''; 
    } 
}