2013-10-02 84 views
1

我試圖從多個嵌套屬性(可能是錯誤的術語)中提取信息。使用php和simpleXML獲取多個嵌套屬性

XML字符串:

<?xml version='1.0' encoding='UTF-8'?> 
<eveapi version="2"> 
    <currentTime>2013-10-01 18:00:01</currentTime> 
    <result> 
    <rowset name="members" key="characterID" columns="characterID, name"> 
     <row characterID="2234" name="Bob"> 
     <rowset name="roles" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRoles" key="roleID" columns="roleID,roleName" /> 
     <rowset name="rolesAtHQ" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRolesAtHQ" key="roleID" columns="roleID,roleName" /> 
     <rowset name="rolesAtBase" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRolesAtBase" key="roleID" columns="roleID,roleName" /> 
     <rowset name="rolesAtOther" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRolesAtOther" key="roleID" columns="roleID,roleName" /> 
     <rowset name="titles" key="titleID" columns="titleID,titleName"> 
      <row titleID="256" titleName="Tiger" /> 
     </rowset> 
     </row> 
     <row characterID="555" name="John"> 
     <rowset name="roles" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRoles" key="roleID" columns="roleID,roleName" /> 
     <rowset name="rolesAtHQ" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRolesAtHQ" key="roleID" columns="roleID,roleName" /> 
     <rowset name="rolesAtBase" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRolesAtBase" key="roleID" columns="roleID,roleName" /> 
     <rowset name="rolesAtOther" key="roleID" columns="roleID,roleName" /> 
     <rowset name="grantableRolesAtOther" key="roleID" columns="roleID,roleName" /> 
     <rowset name="titles" key="titleID" columns="titleID,titleName"> 
      <row titleID="16" titleName="R &amp; D" /> 
      <row titleID="64" titleName="Miner" /> 
      <row titleID="256" titleName="Tiger" /> 
      <row titleID="16384" titleName="POS Manager" /> 
     </rowset> 
     </row> 
    </rowset> 
    </result> 
    <cachedUntil>2013-10-01 18:57:01</cachedUntil> 
</eveapi> 

這裏是我的PHP TODATE:

$simpleXML = simplexml_load_string($xml); // Load XML string data into the simplexml object parser 

foreach ($simpleXML->result->rowset->row as $row) { 
    $name = $row->attributes()->name; 
    $characterID = $row->attributes()->characterID; 

    foreach ($row->rowset as $value) { 
     $titleName .= $value->row->attributes()->titleName.','; 
    } 

    echo $Name.'<br>'; 
    echo $titleName.'<br>'; 
} 

想我要爲每名輸出爲:

鮑勃

約翰

[R & d,礦工,虎,POS管理者

回答

1

它可以是難以奏效如何有時訪問的SimpleXML元素。

你需要的東西是這樣的: -

foreach ($simpleXML->result->rowset->row as $row) { 
    $titles = []; 
    $name = $row['name']->__toString(); 
    foreach($row as $attrib){ 
     if($attrib['name']->__toString() === 'titles'){ 
      foreach($attrib as $title){ 
       $titles[] = $title['titleName']->__toString(); 
      } 
     } 
    } 
    echo $name . ' : ' . implode(' - ', $titles) . "<br/>\n"; 
} 

See it working

1

您正在尋找從XML樹中獲取查詢特定數據。這是最容易使用XPath這也是由的SimpleXMLElement支持完成:

foreach ($rows as $row) { 
    $titleNames = $row->xpath('*[@name="titles"]/row/@titleName'); 
    echo $row['name'], ': ', implode(', ', $titleNames), "\n"; 
} 

這正運行在具有標題的name屬性的子元素各主要行元素上的XPath查詢,然後讓他們所有的row titleName屬性節點 - 當在字符串上下文中使用時,與implode一樣,將其轉換爲它們的屬性值作爲字符串。

該例子的輸出:

Bob: Tiger 
John: R & D, Miner, Tiger, POS Manager 

的代碼示例(無數據):

$xml = simplexml_load_string($xml); 

$rows = $xml->result->rowset->row; 

foreach ($rows as $row) { 
    $titleNames = $row->xpath('*[@name="titles"]/row/@titleName'); 
    echo $row['name'], ': ', implode(', ', $titleNames), "\n"; 
} 

和在線演示:https://eval.in/52408

Xpath查詢工作,顯着好於嵌套結構XML文檔經常伴隨着。如果你想在PHP代碼中表達相同的內容,你將會有更多的嵌套循環。

看得那麼清楚: