[英]PHP XMLReader - Reading not properly formated XML files
這個問題與我在此處發布的另一則帖子有關(以供參考 )
我正在通過FTP從英國的開放數據軌道項目中下載日志文件,每個日志文件大約3Mb並以這種方式呈現:
<?xml version="1.0" encoding="UTF-8"?><Pport xmlns="http://www.thalesgroup.com/rtti/PushPort/v12" ts="2018-02-05T21:33:59.8558288Z" version="12.0"><uR updateOrigin="Darwin"><deactivated rid="201802058015464"/></uR></Pport>
<?xml version="1.0" encoding="UTF-8"?><Pport xmlns="http://www.thalesgroup.com/rtti/PushPort/v12" xmlns:ns3="http://www.thalesgroup.com/rtti/PushPort/Forecasts/v2" ts="2018-02-05T21:33:59.8558288Z" version="12.0"><uR updateOrigin="Darwin"><TS rid="201802058709918" ssd="2018-02-05" uid="W09918"><ns3:Location tpl="DARTFD" wta="07:36"><ns3:arr delayed="true" et="21:34" src="Darwin"/><ns3:plat cisPlatsup="true" platsup="true">2</ns3:plat></ns3:Location></TS></uR></Pport>
<?xml version="1.0" encoding="UTF-8"?><Pport xmlns="http://www.thalesgroup.com/rtti/PushPort/v12" xmlns:ns3="http://www.thalesgroup.com/rtti/PushPort/Forecasts/v2" ts="2018-02-05T21:33:59.8558288Z" version="12.0"><uR updateOrigin="Darwin"><TS rid="201802058771469" ssd="2018-02-05" uid="W71469"><ns3:Location tpl="WLWYCSD" wtd="13:16"><ns3:dep delayed="true" et="21:34" src="Darwin"/></ns3:Location><ns3:Location tpl="WLWYNGC" wtp="13:18"><ns3:pass delayed="true" et="21:36" src="Darwin"/><ns3:plat cisPlatsup="true" platsup="true">3</ns3:plat></ns3:Location><ns3:Location tpl="HATFILD" wtp="13:21:30"><ns3:pass delayed="true" et="21:39" src="Darwin"/><ns3:plat cisPlatsup="true" platsrc="A" platsup="true">1</ns3:plat></ns3:Location><ns3:Location tpl="POTRSBR" wtp="13:26"><ns3:pass delayed="true" et="21:44" src="Darwin"/><ns3:plat cisPlatsup="true" platsup="true">1</ns3:plat></ns3:Location><ns3:Location tpl="ALEXNDP" wtp="13:36:30"><ns3:pass delayed="true" et="21:51" src="Darwin"/><ns3:plat cisPlatsup="true" platsup="true">2</ns3:plat></ns3:Location><ns3:Location tpl="HRGYURV" wta="13:43" wtd="13:48"><ns3:arr delayed="true" et="21:57" src="Darwin"/><ns3:dep delayed="true" et="21:58" src="Darwin"/></ns3:Location><ns3:Location tpl="HRNSYMD" wta="13:50"><ns3:arr delayed="true" et="22:00" src="Darwin"/></ns3:Location></TS></uR></Pport>
為了進一步添加,有時最后一個條目是一個損壞的條目,如下所示:
<?xml version="1.0" encoding="UTF-8"?><Pport xmlns="http://www.thalesgroup.com/rtti/PushPort/v12" xmlns:ns3="http://www.thalesgroup.com/rtti/PushPort/Forecasts/v2" ts="2018-02-05T21:34:52.2569006Z" version="12.0"><uR updateOrigin="Trust"><TS rid="201802056757064" ssd="2018-02-05" uid="C57064"><ns3:Location pta="21:34" ptd="21:34" tpl="DEVNPRT" wta="21:34" wtd="21:34:30"><ns3:arr at
我已經使用了此處給出的建議,並嘗試使用XMLReader實現PHP解決方案,但是XML日志文件的設置方式,XMLReader會出錯。
這是我正在使用的基本代碼:
$xmlReader->open($filename);
// While there is something to read continue reading
while ($xmlReader->read()) {
// check to ensure nodeType is an Element not attribute or #Text
if ($xmlReader->nodeType == XMLReader::ELEMENT) {
if ($xmlReader->hasAttributes) {
//Do something here
}
}
}
}
我認為一種解決方案是,由於日志文件中的每個條目都是單行,因此我認為可以打開文件,然后讀取並加載到XMLReader中,但是我無法做到這一點,就像這樣:
if ($filename = fopen("./pPortData.log", "r")) {
while (!feof($filename)) {
$xmlstr = fgets($filename);
# do same stuff with the $line
$address = new SimpleXMLElement($xmlstr) or die("Error: Cannot create object");
echo $address->getName(), PHP_EOL;
foreach($address as $name => $part) {
echo "$name: $part" . "/n/r", PHP_EOL;
}
}
fclose($xmlstr);
}
但是沒有喜悅。 所以...
1)您知道實現此目標的方法嗎?
2)還是您知道如何將文件中的文件逐行加載到XMLReader中?
3)如何修復XML文件?
謝謝
路西歐
您已經下了最后功夫,一次加載每一行,然后用SimpleXML處理它們應該沒問題。
我進行了一些更改,添加了一些錯誤陷阱,這些錯誤陷阱會拾取可能不完整的最后一條記錄,並僅顯示一條消息。 另一部分是關於如何處理XML數據的,因此,目前我只是從已加載的XML輸出數據。
if ($file = fopen("./pPortData.log", "r")) {
while (!feof($file)) {
$xmlstr = fgets($file);
libxml_use_internal_errors(true);
try {
$xml = new SimpleXMLElement($xmlstr);
echo $xml->getName(), PHP_EOL;
foreach($xml->children() as $part) {
echo $part->asXML() . PHP_EOL;
}
}
catch ( Exception $e ) {
echo "Last part unreadable.".PHP_EOL;
}
}
fclose($file);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.