2013-10-02 3 views
1

중첩 된 여러 속성에서 정보를 가져 오려고합니다. 잘못된 용어 일 수 있습니다.php와 simpleXML로 중첩 된 여러 속성 가져 오기

XML 문자열 :

$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>'; 
} 

나는 각각의 이름에 대한 출력이 될 것하고 싶은 것 : :

<?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의

타이거

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 트리에서 쿼리 관련 데이터를 얻으려고합니다. 이 가장 쉽게도 SimpleXMLElement에서 지원하는 XPath는 수행됩니다 :이 이름 속성과 제목이 그 자식 요소에 각 주 행 요소에 대한 XPath 쿼리를 실행 한 후 점점

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

모든를 행 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 코드에서 같은 것을 표현하고 싶다면 훨씬 더 많은 중첩 루프가 필요합니다.

도 참조 :

관련 문제