[英]Reading child nodes with XMLReader in PHP
背景:我有一個從資源材料和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:Terra | 索林| 24.35 | 0.00 | 0.00 | -23.73 | 8.08
1:Terra | 索林| 24.35 | 0.00 | 0.00 | -23.73 | 8.08
2:Terra | 索林| 24.35 | 0.00 | 0.00 | -23.73 | 8.08
3:Terra | 索林| 24.35 | 0.00 | 0.00 | -23.73 | 8.08
4:Terra | 索林| 24.35 | 0.00 | 0.00 | -23.73 | 8.08
5:Terra | 索林| 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.