在 PHP 中使用 XMLReader 读取子节点



背景:我有一个从资源材料和 m.sarna.net 收集的恒星系统列表。 该数据使用不同的 PHP 文件转换为 xml 文件,此处不讨论。 我从浏览器调用下面的 php 文件,传递名称和长度的变量。 我正在尝试使用 XMLReader 来定位特定节点进行检索,但获取的数据太多。 我不是返回一个元素,然后继续下一个元素,而是重复得到相同的元素,如果我允许的话,会有数千个。 它应该很简单,但我不知道我错过了什么。 请帮忙。 这是针对Battletech的,如果你有兴趣的话。 虽然此文件有 7889 条跳转路径,但包含双跳的文件(最远 60 光年距离(包含大约 24000 个条目,因此文件大小约为 4MB。 不是我每次需要时都想读入内存的东西。

<jumpPathsStandard summary="Unique Jump Paths under 30 light years: 7889">
<Terra>
<from>Terra</from>
<to>Thorin</to>
<distance>24.35</distance>
<fromX>0.00</fromX>
<fromY>0.00</fromY>
<toX>-23.73</toX>
<toY>8.08</toY>
</Terra>
<Terra>
<from>Terra</from>
<to>Yorii</to>
<distance>22.47</distance>
<fromX>0.00</fromX>
<fromY>0.00</fromY>
<toX>-8.08</toX>
<toY>21.39</toY>
</Terra>
<Terra_Firma>
<from>Terra Firma</from>
<to>Woodstock</to>
<distance>22.36</distance>
<fromX>22.69</fromX>
<fromY>-33.90</fromY>
<toX>44.60</toX>
<toY>-37.03</toY>
</Terra_Firma>
<Tetersen>
<from>Tetersen</from>
<to>Tharkad</to>
<distance>12.53</distance>
<fromX>-204.99</fromX>
<fromY>146.05</fromY>
<toX>-215.94</toX>
<toY>152.83</toY>
</Tetersen>

$i=0;
if(isset($_GET["name"]) && isset($_GET["length"])) {
switch ($_GET["length"]) {
case "short":
$xml = new XMLReader();
$xml->open($shortfile);
$items = array();
while($xml->read() && $xml->name !== $_GET['name']);
while($xml->name === $_GET['name']) {
$item = array();
$node = new SimpleXMLElement($xml->readOuterXML());
if($node->from == $_GET['name']) {
echo $i.":      ".$node->from." | ".$node->to." | ".$node->distance." | ".$node->fromX." | ".$node->fromY." | ".$node->toX." | ".$node->toY."<br>";
$i++;
}
}
$xml->$close();
break;
case "long":
# Future use;
break;
}
}

我得到的输出: 测试

0: 泰拉 |索林 |24.35 |0.00 |0.00 |-23.73 |8,08

1: 泰拉 |索林 |24.35 |0.00 |0.00 |-23.73 |8,08

2: 泰拉 |索林 |24.35 |0.00 |0.00 |-23.73 |8,08

3: 泰拉 |索林 |24.35 |0.00 |0.00 |-23.73 |8,08

4: 泰拉 |索林 |24.35 |0.00 |0.00 |-23.73 |8,08

5: 泰拉 |索林 |24.35 |0.00 |0.00 |-23.73 |8.08 ...

您缺少移动到读取循环中下一项的代码

$xml->next($_GET['name']);

所以。。。

while($xml->name === $_GET['name']) {
$item = array();
$node = new SimpleXMLElement($xml->readOuterXML());
if($node->from == $_GET['name']) {
echo $i.":      ".$node->from." | ".$node->to." | ".$node->distance." | ".$node->fromX." | ".$node->fromY." | ".$node->toX." | ".$node->toY."<br>";
$i++;
}
// Next item...
$xml->next($_GET['name']);
}
$xml->$close();

最新更新