2012-07-25 144 views
0

XML:通过XML遍历

<?xml version="1.0" encoding="utf-8"?> 
    <NConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <NDomain>ex1</NDomain> 
      <Parameters> 
       <version>p</version> 
       <siteFolder>site1</siteFolder> 
       <cssGeneral></cssGeneral> 
       <cssLogin>l.css</cssLogin> 
      </Parameters> 
      <Database> 
       <hostname>898</hostname> 
       <username>j</username> 
       <password>k</password> 
       <name>n</name> 
      </Database> 
<NDomain>ex2</NDomain> 
       <Parameters> 
        <version>p</version> 
        <siteFolder>site1</siteFolder> 
        <cssGeneral></cssGeneral> 
        <cssLogin>l.css</cssLogin> 
       </Parameters> 
       <Database> 
        <hostname>898</hostname> 
        <username>j</username> 
        <password>k</password> 
        <name>n</name> 
       </Database> 
     </NConfig> 

我想问下Ex1到所有节点itterate

到目前为止,我可以这样直接访问节点:

$xmldata = simplexml_load_file("config.xml"); 

foreach($xmldata->Parameters as $item) 
{ 
     echo "<p>Version: " . $item->version . "</p>"; 
     echo "<p>Site Folder: " . $item->siteFolder . "</p>"; 
} 

但是这并不会使它成为特定的根节点,而是会遍历列表中的所有参数。我怎样才能做到这一点?

+0

可以请你详细阐述“根节点特定”? – Makesh 2012-07-25 12:16:56

+0

刚刚编辑它 - 以便你有特定的参数节点属于它们各自的根节点: ex2 etc等 – thejoker 2012-07-25 12:42:05

回答

1

如果您<Parameters><Database>为相应<NDomain>是specfic,我更喜欢你应该有UR XML模式是这样的:

 <NDomain> 
      <name>ex1</name> 
      <Parameters> 
       <version>p</version> 
       <siteFolder>site1</siteFolder> 
       <cssGeneral></cssGeneral> 
       <cssLogin>l.css</cssLogin> 
      </Parameters> 
      <Database> 
       <hostname>898</hostname> 
       <username>j</username> 
       <password>k</password> 
       <name>n</name> 
      </Database> 
     </NDomain> 
     <NDomain> 
     <name>ex2</name> 
       <Parameters> 
        <version>p</version> 
        <siteFolder>site1</siteFolder> 
        <cssGeneral></cssGeneral> 
        <cssLogin>l.css</cssLogin> 
       </Parameters> 
       <Database> 
        <hostname>898</hostname> 
        <username>j</username> 
        <password>k</password> 
        <name>n</name> 
       </Database> 
     </NDomain> 

所以,你可以分析如下:

foreach($xmldata->NDomain as $item) 
    { 
    $par = $item->Parameters; 
    echo "<p>Version: " . $par->version . "</p>"; 
    echo "<p>Site Folder: " . $par->siteFolder . "</p>"; 
    } 
+0

明白了!谢谢 – thejoker 2012-07-25 13:55:59

+0

欢迎.... :) – Makesh 2012-07-25 13:58:51

0

你可以只遍历根节点的孩子,像这样:

$first = true; 
foreach($xmldata->children() as $item) 
{ 
    if($first === true) { 
     $first = false; 
     continue; 
    } 
} 

该循环就会赶上<NDomain><Parameters><Database>,所以你需要一个简单的检查,以跳过第一次迭代省略<NDomain>

+0

正确,所以我使用一个如果之前的foreach? – thejoker 2012-07-25 12:43:25

+0

不,在里面。我会更新我的答案。 – nickb 2012-07-25 13:01:56