PHP中的xmlReader-让它正常工作的问题

时间:2012-04-30 17:14:34

标签: xmlreader

我有一个非常大的文件,我需要在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不能以这种方式构建,这可能是问题和一个简单的解决方案。但是在我以前的一个版本中,它提取了数据,但它来自错误的用户代理。所以我认为这是我试图用xmlReader拉取数据的方法。

有没有人对为什么这不起作用有任何想法?谢谢......

2 个答案:

答案 0 :(得分:0)

您没有检查外部while循环中的标记类型。 XMLReader向您发送开始标记,结束标记,标记内容,您至少需要处理其中一些事件。

在您的外部循环中,检查$reader->nodeType == XMLReader::ELEMENT是否有空缺,XMLReader::END_ELEMENT表示结束,XMLReader::TEXT表示标记内容。还有很多其他的 - 请参阅此类的PHP文档(values 0-17)。

答案 1 :(得分: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;
}