2013-05-04 116 views
1

我已經創建了一個類,它讀取值的值和節點名稱,並將其組合到數組中,以將其用作對XML中配置的簡單快速訪問。但是這個解決方案只適用於底層節點,XML看起來像這樣。使用DOMDocument獲取XML中的最後一個節點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 2013-05-04 09:01:31

+0

你爲什麼要在根元素上做一個'foreach'?只有一個根元素。 – 2013-05-04 09:01:40

+0

我想嘗試DOMDocument的PHP,只是爲了瞭解它。而且,我認爲foreach在根中的所有節點上迭代。 – 2013-05-04 09:05:09

回答

0

您可以使用XPath這樣的:

$xp = new DOMXPath($domDocument); 

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

return $config; 
+0

甜的小修改它將涵蓋我所有的需求:)謝謝。 – 2013-05-04 09:16:05