2013-05-04 135 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