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.
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml