簡體   English   中英

在PHP中使用XMLReader讀取子節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM