2013-05-04 3 views
1

Я создал класс, который считывает значение и имя узла и объединяет его в массив, чтобы использовать его в качестве простого и быстрого доступа к конфигурации в XML. Но это решение работает, только если плохо дать нижний узел, XML выглядит так.Получить последний узел в XML, используя DOMDocument PhP

<?xml version="1.0" encoding="ISO-8859-2"?> 
<settings> 
<const> 
    <inscript>true</inscript> 
    <title>Template</title> 
</const> 
<meta> 
</meta> 
<db> 
    <user>user</user> 
    <pass>pass</pass> 
    <host>host</host> 
    <name>name</name> 
</db> 
<path> 
    <style> 
     <css>/Template/view/www/style/</css> 
     <img>/Template/view/www/style/img</img> 
    </style> 
</path> 
</settings> 

Теперь я хочу, чтобы получить, например, весь дб узел и возвращает его в виде массива, где имя узла пустошь быть ключ и значение узла, значение. но я застрял в этом. Вот что я сделал до сих пор.

class config { 

private static $xml = "lib/config/settings.xml"; 
private static $xmlRoot = "settings"; 

public static function loadConfig($value) { 
    $domDocument = new DOMDocument(); 

    $domDocument->load(self::$xml); 
    $settings = $domDocument->getElementsByTagName(self::$xmlRoot); 

    try { 
     foreach ($settings as $setting) { 
      $configValue = $setting->getElementsByTagName($value)->item(0)->nodeValue; 
      $configNode = $setting->getElementsByTagName($value)->item(0)->nodeName; 

      $test = $setting->getElementsByTagName("path")->item(0)->childNodes->item(2)->nodeName; 

      var_dump($test); 

     } 

     $configValue = explode(' ', trim(preg_replace('/\s+/', ' ', $configValue))); 
     $configNode = explode(' ', trim(preg_replace('/\s+/', ' ', $configNode))); 

     $configArray = array_combine($configNode, $configValue); 

     return $configArray; 
    } 
    catch(Exception $e) { 
     echo '<h1>Błąd - '.$e->getMessage().'</h1>'; 
    } 
} 

}

+1

Хотя в большинстве случаев я предпочитаю 'расширение DOM', кажется, что [SimpleXML] (HTTP: // WWW. php.net/manual/en/book.simplexml.php) лучше подходит для этой цели. Вам не нужно самостоятельно анализировать данные узла в массиве. Взгляните на руководство и примеры ... – hek2mgl

+0

Почему вы делаете 'foreach' на корневом элементе? Есть только один корневой элемент. –

+0

Я хотел попробовать DOMDocument для php, просто чтобы узнать его. И foreach итерации на всех узлах в корне, я думаю. –

ответ

0

Вы можете использовать XPath, как это:

$xp = new DOMXPath($domDocument); 

$config = array(); 
foreach ($xp->query('./db/*') as $node) { 
     $config[$node->nodeName] = $node->textContent; 
} 

return $config; 
+0

Сладкий с небольшим изменением он покроет все мои потребности :) спасибо. –

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