【问题标题】:Getting multiple nested attributes with php and simpleXML使用 php 和 simpleXML 获取多个嵌套属性
【发布时间】:2013-10-02 13:57:04
【问题描述】:

我正在尝试从多个嵌套属性中提取信息(可能是错误的术语)。

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:

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

我想为每个名称输出的是:

鲍勃

老虎

约翰

研发、矿工、老虎、POS经理

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    您希望从 XML 树中获取特定于查询的数据。使用 SimpleXMLElement 也支持的 Xpath 最容易做到这一点:

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

    这是对具有 titles 作为名称属性的子元素上的每个主行元素运行 xpath 查询,然后获取它们的所有行 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 代码中表达同样的内容,你会有更多的嵌套循环。

    参见:

    【讨论】:

      【解决方案2】:

      有时很难弄清楚如何访问 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.

      【讨论】:

        猜你喜欢
        • 2012-05-19
        • 2011-09-17
        • 2017-03-14
        • 2012-10-03
        • 2018-08-04
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多