Xu ,
There can be 3 approaches for sending the XML file / contents
thru network
1)
FTP the Xml File
2)
Send the XML as
a String Buffer using libxml2 APIs
3)
Send a fixed size
buffer which reads the Xml file at Source ( line by line or of a buffer size )
in a Loop till EOF is encountered.
Use the 3rd Approach if Xml file to send
is quite large.
-------------------- Approach 2 ---------------------
In the 2nd approach at the Sender 1st
get xmlDocPtr of the Xml by
using xmlParseFile(const char* filename
Then pass it to the API xmlDocDumpFormatMemory(xmlDocPtr
ptrXMLDoc, xmlChar** pmemXmlbuff, int*
pnBufSize, int nFormat)
Pass nFormat = 1 to get the Indented representation of the
XML string.
Say I have the Buffer & Size Vars as ……..
xmlChar *xmlbuff;
int nBuffersize;
I use the above API like
xmlDocDumpFormatMemory(xmlParseFile(“XMLFileName.xml”), &xmlbuff,
&nBuffersize,1)
Sender can then send this data to the client in 2
steps.
First it sends the size of the XML bufer …..
Something like……
char dataBuf[1024];
memset( data,0,sizeof(data) );
sprintf( data,"%d", nBuffersize);
send (SOCKET(Windows) or SD(Unix), (const char*) data , sizeof(data),
0 );
Reciever then collects the size of the XML Buffer
recv(SOCKET(Windows) or SD(Unix), (const char*) data , sizeof(data),
0 );
int nBufSize = atoi(data);
Once he has the size he can do
char* pXmlBuf = new char[nBufSize];
Sender now sends the whole XmlBuffer
if (
nBuffersize > 0 )
send
(SOCKET(Windows) or SD(Unix),(const char*)xmlbuff ,nBuffersize, 0 );
Remember also to free the XML
buffer at the sender
xmlFree(xmlbuff);
Reciever now gather this XML buffer…..
recv(SOCKET(Windows) or SD(Unix), pXmlBuf, sizeof(nBufSize), 0 );
Once Reciever has both he can Parse the In-Memory XML
buf using
xmlParseMemory(pXmlBuf , nBufSize).
-------------------- Approach 3 ---------------------
I guess u r using this approach to send a fix size buffer
by reading Xml file at source using File API.
U send it in a loop till EOF is encountered.
In the reciever u r using a loop to recv all data &
parsing.
In the 1st call xmlParseMemory() works fine ,
but in 2nd since Xml Data send is not from start but somewhere from
middle so
xmlParseMemory() fails
Alternatively u can keep on appending data to a file &
later parse that using xmlParseFile() which works allright.
[xml]
xmlParseMemory() problem
- From:
"Xu Xiaogang-a19881" <nickxu motorola com>
- To:
<xml gnome org>
- Subject:
[xml] xmlParseMemory() problem
- Date:
Sun, 1 Jun 2008 18:12:34 +0800
size=2 width="100%"
align=center>
Hi Experts,
I am using xmlParseMemory() to parse the
content retrieved from the network, which is not well formatted.
xmlParseMemory() can work for the
first call.
But if I create a loop to keep
parsing the content continuously, this function will return NULL from the
second call. If I save the content to a file, and use xmlParseFile() to
parse the contents in the same loop. It can work. The libxml2
lib I use is libxml2-2.6.30 on Window XP.
I am not sure whether there is more clean
work than xmlFreeDoc() when using xmlParseMemory().
Regards
-Xiaogang
DISCLAIMER: This email may contain confidential or privileged information for the intended recipient(s) and the views expressed in the same are not necessarily the views of Zensar Technologies Ltd. If you are not the intended recipient or have received this e-mail by error, its use is strictly prohibited, please delete the e-mail and notify the sender. Zensar Technologies Ltd. does not accept any liability for virus infected mails.
|