我有一个非常大的文件,我需要在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拉取数据的方法。
有没有人对为什么这不起作用有任何想法?谢谢......
答案 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;
}