[英]What's the most efficient way to parse incomplete XML messages over a stream?
我有一個TCP連接,可以通過流向我發送XML消息。
我在<?xml version="1.0" encoding="utf-8"?>
消息中收到的第一條消息。
第二個是身份驗證請求消息,它提供了一個種子,用於哈希我的憑據以發送回服務器時使用- <session seed="VJAWKBJXJO">
。
此時,我應該發送回<session user="admin" password_hash="123456789">
消息以對自己進行身份驗證。
一旦通過身份驗證,我將以<Msg>data</Msg>
的形式接收所需的數據。
如果我沒有及時通過服務器進行身份驗證,則會收到</session>
消息,表明會話已關閉。
問題是我不能使用DOM解析器,因為嘗試解析沒有結束標簽的<session>
標記總是會引發錯誤,因此我嘗試使用Xerces-c SAX解析器來逐步解析XML。
當我收到我想最好將其追加到每個消息MemBufInputSource
其中包含當前已收到的所有XML,然后執行parseNext
的緩沖解析已接收新的XML,但我無法弄清楚如何使它正常工作。
是否有解決此問題的更好方法? 也許只是對<session></session>
消息使用特殊情況?
謝謝
您是否嘗試過使用其他解析器? 如果沒有,我使用的是libxml2( http://xmlsoft.org/ ),它非常簡單,它允許您隨意處理錯誤。
您可以從流(您的連接)創建xmlTextReaderPtr:
xmlTextReaderPtr reader = xmlReaderForMemory(...)
然后遍歷節點,直到找到您的數據:
while ( (result=xmlTextReaderRead(reader))== 1 )
{
int nodetype = xmlTextReaderNodeType(reader);
if ( nodetype == XML_READER_TYPE_ELEMENT )
{
const xmlChar* name = xmlTextReaderConstName(reader);
/* now name is the name of the element, like "session" */
if ( strcmp(name,"session")==0 )
{
/* now look for the XML_READER_TYPE_ATTRIBUTE named "seed" and read the
* value with xmlTextReaderConstValue to get the seed value */
}
}
}
它們也有一個簡單的示例,用於解析值:
http://xmlsoft.org/examples/reader1.c
它確實有很多功能,盡管我只能說基本的閱讀,寫作和xinclude功能。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.