2012-10-05 100 views
1

我有一個服務器的TLS/TCP連接,它將XML文檔作爲文檔流提供服務。在任何時候,該流可以具有:使用simplexml_load_string解析XML文檔STREAM

  1. 的局部文檔(例如<doc1>one
  2. 一個完整的文檔(例如<doc1>one</doc1>
  3. 一個完整的文檔和局部文檔(例如<doc1>one</doc1><doc2>
  4. 多個文件等(例如<doc1>one</doc1><doc2>two</doc2>

當我從流中讀取數據時,我只是將讀取的數據追加到「unparsed」緩衝區,然後嘗試解析buff呃與simplexml_load_string。 (1)是好的(失敗),和(2)是好的(工作),我的問題當然是(3)和(4)失敗並帶有額外的數據。我實際上沒有辦法對解析器說「只解析第一個X字符」(或使用substr),因爲這需要實際解析XML。這些文件當然比例子複雜得多。有沒有什麼辦法:

  1. 化妝simplexml_load_string忽略額外的數據,並將它返回一個文檔,並將其從字符串所消耗的字符數(所以我可以做緩衝處理),或
  2. 使用一些其他的解析器/約定

謝謝。

+0

你可能想考慮使用一個專門用於流的解析器,如[XmlReader ](http://php.net/manual/en/book.xmlreader.php)或[Xml Parser](http://php.net/manual/en/book.xml.php)。 –

回答

0

回答了我自己的問題。基本上,如果我使用xml_parser_createxml_parse,並且由於Invalid document end而失敗,它會通過xml_get_current_byte_index告訴我它失敗的位置。然後,我可以在這一點上採取substr並再次嘗試。不考慮效率,它似乎適用於所有案例概述,除了告訴如果失敗將永久或不...