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でデータを取得しようとしている方法にあると考えています。
なぜこれがうまくいかないのか、誰にも考えがありますか? ありがとうございました...