2

我目前有以下 XML 结构:

<root>
  <maininfo>
    <node>
      <tournament_id>3100423</tournament_id>
      <games>
        <a_0>
          <id>23523636</id>
          <type>
            <choice_4>
              <choice_id>345</choice_id>
            <choice_4>
            <choice_9>
              <choice_id>345</choice_id>
            <choice_9>
            ... etc
          </type>
        </a_0>
        <a_1></a_1>
        <a_2></a_2>
        ...etc
      </games>
    </info>
  </node>
</root>

我只需执行以下操作即可轻松获取第一个节点元素“a_0”的 id:

maininfo[0]->a_3130432[0]->games[0]->a_1[0]->id;

我的问题是: 如何通过 all 自动迭代(使用 foreach)a_0,并获取每个节点元素及其所有子元素的值,如 "345" a_1in ?a_2<choice_id>345</choice_id>

, 的结尾数字+ , 的子节点是动态创建的a_0,并且_[number] 中没有逻辑,每个下一个元素都用 +1 进行计数。a_1choice_4choice_9

4

3 回答 3

2

正如之前在 Stackoverflow 上(例如在Read XML dynamic PHP中)以及在 PHP 手册中(例如在Basic SimpleXML 用法中)所概述的那样,您可以使用foreach.

例如要遍历所有a_*元素,它只是

foreach ($xml->maininfo->node->games[0] as $name => $a) {
    echo $name, "\n";
}

输出:

a_0
a_1
a_2

然后你想再次迭代这些他们的->type孩子。通过将一个放入另一个中,这在纯 PHP 中是可能的:foreach

foreach ($xml->maininfo->node->games[0] as $name => $a) {
    echo $name, "\n";

    if (!$a->type[0]) {
        continue;
    }

    foreach ($a->type[0] as $name => $choice) {
        echo ' +- ', $name, "\n";
    }
}

现在输出:

a_0
 +- choice_4
 +- choice_9
a_1
a_2

这开始变得有点复杂。正如您可以想象的那样,由于 XML 以其树结构而闻名,您并不是第一个遇到这个问题的人。因此,发明了一种从 XML 文档中获取元素的查询语言:Xpath

使用Xpath,您可以像访问文件系统一样访问 XML 数据。据我所知,每个a_*元素都是类型的子元素,games每个元素都是choice_*类型的子元素,这非常简单:

 /*/maininfo/node/games/*/type/*
  ^                     ^      ^
  |                     |   choice_*
root                    |
                       a_*

在 PHP Simplexml 中,这看起来像:

$choices = $xml->xpath('/*/maininfo/node/games/*/type/*');

foreach ($choices as $choice) {
    echo $choice->getName(), ': ', $choice->choice_id, "\n";
}

输出:

choice_4: 345
choice_9: 345

如本例所示,现在使用单个foreach.

如果您还需要访问<a_*>元素,则需要有多个foreach's您自己的迭代,但这甚至是一个更高级的主题,我想说它会超出您问题的范围。

我希望到目前为止这是有帮助的。另请参阅SimpleXMLElement::children()它也给了所有孩子(如->games[0]第一个例子)。所有示例代码都可以作为有效的交互式在线演示使用

于 2013-07-22T13:22:39.430 回答
0

If I understand it well, you can do something like:

for($i = 0; $i < $max; ++$i){
    $a = $parentNode->{'a_'.$i};
}
于 2013-07-21T19:05:43.670 回答
0

您可以使用 SimpleXML 轻松完成此操作:

<?php
$xmlStr = "<?xml version='1.0' standalone='yes'?>
<root>
  <maininfo>
    <node>
      <tournament_id>3100423</tournament_id>
      <games>
    <a_0>
      <id>23523636</id>
      <type>
        <choice_4>
          <choice_id>345</choice_id>
        </choice_4>
        <choice_9>
          <choice_id>345</choice_id>
        </choice_9>
      </type>
    </a_0>
    <a_1></a_1>
    <a_2></a_2>
      </games>
  </node>
  </maininfo>
</root>";

$xmlRoot = new SimpleXMLElement($xmlStr);
$i = 0;
foreach($xmlRoot->maininfo[0]->node[0]->games[0] as $a_x)
{
    echo $i++ . " - " . htmlentities($a_x->asXML()) . "<br/>";
}
?>

我已经修改了您的 XML 字符串的某些部分以使其在语法上正确。您可以在http://phpfiddle.org/main/code/56q-san查看结果

于 2013-07-21T19:48:48.363 回答