2011-01-24 1 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 работая на разбор всех этой информации в PHP с использованием DOM. Ex.

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

Im интересно, если Im делать что-то в корне неправильно, или как получить это происходит. Я отрывал свои волосы уже несколько часов.

+0

Работает для меня! Какой PHP вы используете? –

+0

'getElementsByTagName' возвращает' DOMNodeList'. Вы уверены, что можете перебирать его через foreach? (Просто спрашиваю) – Jonas

+1

Не существует использования XPath. Retagging –

ответ

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; 
     } 
} 
+3

Я хочу поцеловать тебя в рот прямо сейчас. Это работало как шарм. Я люблю/ненавижу, когда это так просто. – DaOgre

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

Я пытался использовать DomXpath, как вы упомянули здесь, но проблема, с которой я столкнулся, заключалась в том, чтобы различать, какой пользователь был связан с номером телефона. Похоже, что использование xpath на стороне объекта, возвращаемого из $ userInfo, будет работать, я не думал об этом. Другой ответ более тесно касается того, что мне нужно, но это выглядит действительно солидно. Спасибо, что нашли время, чтобы помочь, и когда я снова вхожу в xpath. Я уверен, что я буду использовать это. – DaOgre

 Смежные вопросы

  • Нет связанных вопросов^_^