1

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

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经理

4

2 回答 2

2

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

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

这是在具有标题作为名称属性的那些子元素上的每个主行元素上运行 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 代码中表达相同的内容,您将有更多的嵌套循环。

另见:

于 2013-10-03T18:05:16.230 回答
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";
}

看到它工作

于 2013-10-02T14:38:54.667 回答