0

PHPで解析する必要があるかなり大きなファイルがあるため、xmlReaderを使用しています。私はxmlをいじり始めたばかりで、いくつかの問題を抱えています....

これがxmlの構造です...

<?xml version="1.0" encoding="utf-8"?>
    <devices>
        <os name="os1">
            <device user_agent="uaValue1">
                <device_name>name1</device_name>
                <device_os>osValue1</device_os>
            </device>
            <device user_agent="uaValue2">
                <device_name>name2</device_name>
                <device_os>osValue2</device_os>
            </device>   
        </os>
        <os name="os2">
            <device user_agent="uaValue3">
                <device_name>name3</device_name>
                <device_os>osValue5</device_os>
            </device>
            <device user_agent="uaValue4">
                <device_name>name4</device_name>
                <device_os>osValue4</device_os>
            </device>   
        </os>
        <manufacturer name="mf1">
            <device user_agent="uaValue5">
                <device_name>name5</device_name>
                <device_os>osValue5</device_os>
            </device>
            <device user_agent="uaValue6">
                <device_name>name6</device_name>
                <device_os>osValue6</device_os>
            </device>       
        </manufacturer>
        <manufacturer name="mf2">
            <device user_agent="uaValue7">
                <device_name>name7</device_name>
                <device_os>osValue7</device_os>
            </device>
            <device user_agent="uaValue8">
                <device_name>name8</device_name>
                <device_os>osValue8</device_os>
            </device>       
        </manufacturer> 
    </devices>

次の関数を使用して xml を読み取ろうとしています (ここで、$findby は os またはメーカーを渡します / $atr_value は $findby 値の属性名です / $ua_str はユーザー エージェントです)。

function get_data($findby,$atr_value,$ua_str) {
    $data['device_name'] = '';
    $data['device_os'] = '';

    $xml = new XMLReader;
    $xml->open('devices.xml');

    while($xml->read()) {
        if ($xml->name == $findby) {
            if ($xml->getAttribute('name') == $atr_value) {
                while($xml->read()) {
                    if ($xml->name == "device") {
                        if ($xml->getAttribute('user_agent') == $ua_str) {
                            while($xml->read()) {                               
                                if ($xml->name == "device_name") {
                                    $data['device_name'] = $xml->value;
                                }
                                if ($xml->name == "device_os") {
                                    $data['device_os'] = $xml->value;
                                }
                            }
                        }
                    }                   
                }
            }
        }
    }
    $xml->close();
    return $data;
}

あちこちでいくつかの値をエコーすることにより、ユーザー エージェントにデータをプル ダウンするように見えますが、device_name または device_os を取得しません。

明らかに、これは機能していません。私は、xml をそのように構造化することはできないと考えていましたが、これは問題であり、簡単に修正できる可能性があります。しかし、私の以前のバージョンの 1 つで、データをプルしましたが、それは間違ったユーザー エージェントからのものでした。だから私はそれがxmlReaderでデータを取得しようとしている方法にあると考えています。

なぜこれがうまくいかないのか、誰にも考えがありますか? ありがとうございました...

4

2 に答える 2

0

外側の while ループでタグの種類をチェックしていません。XMLReader は、開始タグ、終了タグ、タグ コンテンツを送信します。これらのイベントの少なくとも一部を処理する必要があります。

外側のループで$reader->nodeType == XMLReader::ELEMENT、開始、XMLReader::END_ELEMENT終了、およびXMLReader::TEXTタグの内容を確認します。他にもたくさんあります - このクラス (値 0-17 ) の PHP ドキュメントを参照してください。

于 2012-04-30T18:00:43.643 に答える
0

必要な要素を属性として追加し、そのように呼び出してデータを取得するだけになりました...

function get_data($ua_str) {
    $data = array();

    $xml = new XMLReader;
    $xml->open('devices.xml');

    while($xml->read()) {
        if ($xml->nodeType == XMLReader::ELEMENT && $xml->name == 'device') {
            while($xml->read()) {
                if ($xml->getAttribute('user_agent') == $ua_str) {
                    $data['device_mf'] = $xml->getAttribute('device_mf');
                    $data['device_os'] = $xml->getAttribute('device_os');
                    $data['device_name'] = $xml->getAttribute('device_name');
                }
            }
        }
    }
    $xml->close();
    return $data;
}
于 2012-05-01T02:37:22.863 に答える