xml — PHP-анализ файла QBO с использованием strpos и substr

Мне нужен код PHP, который будет анализировать определенные значения из файла QuickBooks Online (QBO), также известного как формат файла OFX / QFX (http://en.wikipedia.org/wiki/QFX_%28file_format%29).

Ниже приведен раздел моего примера файла QBO, который можно использовать для тестирования:

OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE

<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0<SEVERITY>INFO</STATUS><DTSERVER>20150518082838<LANGUAGE>ENG<FI><ORG>Bank Name<FID>1234</FI><INTU.BID>1234<INTU.USERID>123456789012</SONRS></SIGNONMSGSRSV1>
<BANKMSGSRSV1><STMTTRNRS><TRNUID>0<STATUS><CODE>0<SEVERITY>INFO</STATUS><STMTRS><CURDEF>USD<BANKACCTFROM><BANKID>123456789<ACCTID>12345678901<ACCTTYPE>CHECKING</BANKACCTFROM><BANKTRANLIST><DTSTART>20140204235959<DTEND>20150512235959
<STMTTRN><TRNTYPE>DIRECTDEBIT<DTPOSTED>20140204235959<TRNAMT>-000000056.32<FITID>2014000000000000000000000000000000000000000000000000000<NAME>ELECT PWR<MEMO>WEB</STMTTRN>
</BANKTRANLIST><LEDGERBAL><BALAMT>123.45<DTASOF>20150515235959</LEDGERBAL><AVAILBAL><BALAMT>123.45<DTASOF>20150515235959</AVAILBAL></STMTRS>
</STMTTRNRS></BANKMSGSRSV1></OFX>

У меня возникают проблемы с получением значений из QBO в массив в php. Я смотрел на различные утилиты, такие как QBO2CSV (http://www.propersoft.net/qbo2csv/home) и FixOFX (https://github.com/wesabe/fixofx) и хотел бы использовать только PHP-код, чтобы сделать это, если это вообще возможно. QBO2CSV, кажется, почти работает, если я использую командную строку для преобразования QBO в CSV, а затем анализирую CSV, но если бы я мог просто сделать это в PHP, я мог бы сделать несколько шагов.

У меня также есть проблема очистки QBO и последующего использования SimpleXMLElement, так как файлы QBO являются очень нестандартным XML, и я не смог очистить его достаточно, чтобы SimpleXMLElement принял его как стандартный XML. Лучший пример, который я нашел для этого: http://www.ibm.com/developerworks/library/x-ofxv2/
…и это почти работает. Это самое близкое решение кода, которое я нашел, но оно все еще не дает результатов. Это решение также пытается использовать SimpleXMLElement после очистки QBO, но оно также испытывает трудности при очистке QBO, чтобы быть принятым SimpleXMLElement.

Части моего попытанного решения приведены ниже, но у меня возникли проблемы с скобками XML.

Мой код:

// READ CONTENTS OF FILE TO STRING
$cont = file_get_contents('C:\xampp\htdocs\testparse\test.qbo');

// STRIP OUT HEADER
$bline = strpos($cont,"<OFX>");
$head = substr($cont,0,$bline-2);
$ofx = substr($cont,$bline-1);

// 3. Examine tags that might be improperly terminated
$ofxx = $ofx;

// NUMBER OF TAGS
$numtags = substr_count($ofxx, '<');

// INIT LOOP
$tagloop = 1;

// PARSE THROUGH TAGS
while ($tagloop <= $numtags){
$tagloop++;
$pos = strpos($ofxx,'<');
$pos2 = strpos($ofxx,'>');
$ele = substr($ofxx,$pos+1,$pos2-$pos-1);

// FIND TAGS AND MAKE SURE THEY ARE IN HTML FORMAT WITH BRACKETS:
$tagstart = "<";
$tagend = ">";
$omittag = $tagstart . $ele . $tagend;
//FIND END OF TAG
$pos3 = strpos($omittag,'>');
$pos4 = $pos3+1;
//STRIP TAG OF ANY REMAINING CHARS AFTER THE ">" CHAR
//FOR SOME REASON OCCASIONALLY THE STRING WOULD BE LONGER THAN INTENDED, SO THIS MAKES SURE IT IS CUT OFF AFTER ">"$omittag2 = substr($omittag, 0, $pos4);
//REMOVE TAG FROM MAIN STRING
$ofxx = preg_replace($omittag2, '', $ofxx, 1);

// TROUBLES OCCUR HERE...I CAN'T SEEM TO BE ABLE TO GET RID OF EMPTY <> and > CHARS...NOT SURE WHY THEY ARE HERE SINCE THE ABOVE SHOULD HAVE REMOVED ALL OF THE TAG BUT SOMETIMES "<>" OR ">" REMAIN
// WHAT I AM THEN TRYING TO DO IS TO GRAB THIS TAG'S NAME AND THEN EVENTUALLY STORE IT IN AN ARRAY ALONG WITH ITS DATA. SINCE QBOs DO NOT HAVE TERMINATING TAGS THEY EITHER NEED CONVERTING TO SELF TERMINATING TAGS OR JUST TRY AND GRAB A TAG VALUE, AND THE DATA THAT FOLLOWS IT AS THE DATA FOR THAT TAG
//FIND START OF NEXT TAG
$pos5 = strpos($ofxx,'<');
//USE THE START OF POS5 OF THAT TAG TO GRAB DATA FOR THE CURRENT TAG IF POS5 GREATER THAN ZERO
if ($pos5 > 0) {
$tagdata = substr($ofxx, 0, $pos5);
}
// 5. Deal with special characters
$ofxx = str_replace('&','&amp;',$ofxy);
} // END LOOP

Я думаю, что моя самая большая проблема связана с «<Символы «и»>. У меня проблемы с удалением, когда я прохожу строку и анализирую значения.

Как только я увижу правильные значения, я начну добавлять их в массив, а затем добавлять в базу данных MySQL.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]