2012-07-25 6 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> 

Я хотел бы itterate через все узлы под EX1

До сих пор, я могу получить прямой доступ к узлам, делая это:

$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

+0

Только что отредактировано - чтобы у вас были определенные узлы параметров, принадлежащие их соответствующим корневым узлам: ex2 и т. Д. И т. Д. – thejoker

ответ

1

Если <Parameters> и <Database> быть specfic для соответствующего <NDomain>, я предпочитаю вы должны иметь ур 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

+0

приветствую .... :) – Makesh

0

Вы можете просто итерацию по корневые узлы детей, как это:

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

Этот цикл будет ловить <NDomain>, <Parameters> и <Database>, так что вам нужно просто проверить, чтобы пропустить первую итерацию опустить <NDomain>.

+0

Правильно, поэтому я использую if перед foreach? – thejoker

+0

Нет, внутри. Я уточню свой ответ. – nickb