XML over TCP
如果要完整的支持XML over TCP,只有两种办法:
1,加一个header去标明数据的长度
2,加一个delimiter去标明数据的结束
这两种方法都不够优雅。我们不需要一个通用的方法,我们只要一个最适合我们的方法。
通常,我们能够自定义数据的格式,而且我们通常一条消息只有一个root node,那么我们可以试试下面的函数:
//return length of the xml message
//return -1 for invalid data
//return 0 for not fully received
int GetXmlLen(string buf, string rootName)
{
string head = "<" + rootName;
if (buf.Length < head.Length)
{
//not fully recved
return 0;
}
if (!buf.StartsWith(head))
{
//invalid
return -1;
}
int idx = buf.IndexOf('>');
if (idx < 0)
{
//not fully recved
return 0;
}
if (buf[idx-1] == '/')
{
//empty root element
return (idx + 1);
}
string tail = "</" + rootName + ">";
idx = buf.IndexOf(tail);
if (idx < 0)
{
//not fully recved
return 0;
}
return (idx + tail.Length);
}
要求:XML消息只有一个root node,rootName不是任何子节点的名字,而且消息是以"/>"或者"</rootName>"结尾。
这并不是很苛刻的要求,大多数基于XML的协议实际上就是这样的。
如果你的XML协议满足上述要求,那么当你在TCP上传输XML的时候,就可以试试我的函数。
PS:这个示例函数是用C#写的,用其他语言也很容易实现同样的功能。
相关文档:
下载 dom4j-1.6.1.jar。
1: package org.zzp.common.xml.dom4j;
2:
3: import java.io.FileWriter;
4: import java.io.IOException;
5: import org.dom4j.Document;
6: import org.dom4j.DocumentHelper;
7: import org.dom4j.Element;
8: import org.dom4j.io.OutputFormat;
9: impor ......
写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介 ......
对于小型数据存储很方便。
但多了就要遇到IO瓶颈。
另外,XML格式比较通用。
一般来说,复杂型的数据存储还是用数据库好些。处理方便。而且效率高。
通用性强,可以在任何平台上使用。小型的数据都可以使用XML。
缺点就是有一个缓存的问题
1)XML可以用于本地计算的数据。传递到桌面的数据可以进行本地计算。XM ......
SQLServer2005分解并导入xml文件 收藏
测试环境SQL2005,windows2003
DECLARE @idoc int;
DECLARE @doc xml;
SELECT @doc=bulkcolumn from OPENROWSET(
BULK 'D: \test.xml',
SINGLE_BLOB) AS x
EXEC sp_xml_preparedocument @Idoc OUTPUT, @doc
......