2012-08-10 1 views
1

ОК, у меня есть некоторые базовые XML в следующем формате:Extracing пар имя/значение для узлов XML второго уровня

<application> 
    <authentication> 
     <id>26</id> 
     <key>gabe</key> 
    </authentication> 
    <home> 
     <address>443 Pacific Avenue</address> 
     <city>North Las Vegas</city> 
     <state>NV</state> 
     <zip>89084</zip> 
    </home> 
</application> 

Я загрузке выше XML в переменную с помощью simplexml_load_string(), следующим образом:

$xml = simplexml_load_string($xml_string); 

Я хотел, чтобы извлечь из пары имя/значение второго узлов, например, я хочу, чтобы игнорировать <authentication> и <home> узлы. Я только интерес детей узлов внутри этих узлов первого уровня:

  1. Ид
  2. ключ
  3. адрес
  4. город
  5. состояние
  6. почтовый

Так Я ищу цикл foreach, который выберет выше пары пар имя/значение, но игнорирует «нижнюю левую» l "пары имени/значения. Ниже код выводит только пару имя/значение для <authentication> и <home> узлов (которые я хочу, чтобы игнорировать):

foreach($xml->children() as $value) { 
    $name = chop($value->getName()); 
    print "$name = $value"; 
} 

Может кто-нибудь помочь мне с кодом, который будет извлекать из ТОЛЬКО имя/значение пары для 6 узлов, упомянутых выше?

ответ

0

Вы можете использовать XPath: http://php.net/manual/en/simplexmlelement.xpath.php

С путем

/application/*/* 

Вы получите все элементы второго уровня.

EDIT:

$string = <<<XML 
<application> 
    <authentication> 
     <id>26</id> 
     <key>gabe</key> 
    </authentication> 
     <home> 
      <address>443 Pacific Avenue</address> 
      <city>North Las Vegas</city> 
      <state>NV</state> 
      <zip>89084</zip> 
     </home> 
    </application> 
XML; 

    $xml = new SimpleXMLElement($string); 

    foreach($xml->xpath('/application/*/*') as $node){ 
     echo "{$node->getName()}: $node,\n"; 
    } 
+0

Я все еще не могу извлечь соответствующее имя элементов второго уровня, только значение. См. Мой ответ ниже. –

0

ОК, так что я рассмотрел ваше предложение (Oliver A.) и придумал следующий код:

$string = <<<XML 
<application> 
    <authentication> 
     <id>26</id> 
     <key>gabe</key> 
    </authentication> 
    <home> 
     <address>443 Pacific Avenue</address> 
     <city>North Las Vegas</city> 
     <state>NV</state> 
     <zip>89084</zip> 
    </home> 
</application> 
XML; 

$xml = new SimpleXMLElement($string); 

/* Search for <a><b><c> */ 
$result = $xml->xpath('/application/*/*'); 

while(list(, $node) = each($result)) { 
    echo '/application/*/*: ',$node,"\n"; 
} 

который возвращает следующее:

/application/*/*: 26 
/application/*/*: gabe 
/application/*/*: 443 Pacific Avenue 
/application/*/*: North Las Vegas 
/application/*/*: NV 
/application/*/*: 89084 

Это прогресс, потому что теперь у меня есть значения только для элементов второго уровня. Большой! Проблема в том, что мне нужно назначить имя переменной для пар имени и значения. Похоже, я не могу извлечь имя каждого узла второго уровня. Я что-то упускаю?

+0

xpath возвращает простые xml elemnts. Если вы используете их как строки, вы увидите только внутреннее значение, но yu может использовать для них методы объектов. Попробуйте «$ node-> getName()» –

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

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