免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 17161 | 回复: 12
打印 上一主题 下一主题

[桌面系统] 用C解析XML的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-01 14:44 |只看该作者 |倒序浏览
10可用积分
网上的一些资料表明使用Expat或者LibXml的库对中文的支持都不太好,需要转码,可能会影响效率。
TinyXml看似可以解决中文问题,不过是用DOM方式的解析(效率可能不如SAX方式高)

请做过的高手讲一下Linux下C解析XML可行性如何?可行/效率/稳定?

[ 本帖最后由 hareqiqi 于 2007-2-1 14:50 编辑 ]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2007-02-01 14:51 |只看该作者
原帖由 hareqiqi 于 2007-2-1 14:44 发表于 1楼  
网上的一些资料表明使用Expat或者LibXml的库对中文的支持都不太好,需要转码,可能会影响效率。
TinyXml看似可以解决中文问题,不过是用DOM方式的解析(效率可能不如SAX方式高)


  你所有的数据如果是UTF-8的,那么就不需要任何转码工作。
  如果你又不想转码,那么就让你的数据是UTF-8的吧。

  1. 经过不断的接触,发现LibXML2自身已经支持了中文编码.只是他的所有api处理的数据都是UTF-8类型的,所以只要在读入和写入数据时进行相应转换即可!而且libxml2已融合了iconv,以下是代码!flags标示是读入(0)还是写入(1)!已测试通过

  2. uint8_t *convert(uint8_t *in, char *encoding, uint8_t flags)
  3. {
  4.     uint8_t *out;
  5.     int ret, size, out_size, temp;
  6.     xmlCharEncodingHandlerPtr handler;
  7.     size = (int) strlen( (char*)in ) + 1;
  8.     out_size = size * 2 - 1;
  9.     out = (uint8_t *)malloc((size_t) out_size);
  10.     if (out) {
  11.         handler = xmlFindCharEncodingHandler(encoding);
  12.         if (!handler) {
  13.             free(out);
  14.             out = NULL;
  15.         }
  16.     }
  17.     if (out) {
  18.         temp = size - 1;
  19.         if ( flags ) {
  20.             ret = handler->input(out, &out_size, in, &temp);
  21.         }else {
  22.             ret = handler->output(out, &out_size, in, &temp);
  23.         }
  24.         if (ret || temp - size + 1) {
  25.             if (ret) {
  26.                 printf("conversion wasn't successful.\n");
  27.             } else {
  28.                 printf("conversion wasn't successful. converted: ");
  29.             }
  30.             free(out);
  31.             out = NULL;
  32.         } else {
  33.             out =(uint8_t *) realloc(out, out_size + 1);
  34.             out[out_size] = 0;  /*null terminating out */
  35.         }
  36.     } else {
  37.         printf("no mem\n");
  38.     }
  39.     return (out);
  40. }

  41. int main(int argc, char **argv)
  42. {
  43.     uint8_t *content, *out, *in;
  44.     xmlDocPtr doc;
  45.     xmlNodePtr rootnode;
  46.     char *encoding = "ISO-8859-1";
  47.     //char *encoding = "utf-8";
  48.     if (argc <= 1) {
  49.         printf("Usage: %s content\n", argv[0]);
  50.         return (0);
  51.     }
  52.     content = (uint8_t *)argv[1];


  53.     out = convert(content, encoding, 1);
  54.     in = convert( out, encoding, 0 );
  55.     doc = xmlNewDoc( (xmlChar*)"1.0" );
  56.     printf( "%s:%s\n", encoding, out  );
  57.     printf( "%s:%s\n", encoding, in  );
  58.     rootnode = xmlNewDocNode(doc, NULL, (const xmlChar *) "root", out);
  59.     xmlDocSetRootElement(doc, rootnode);
  60.     xmlSaveFormatFileEnc("-", doc, encoding, 1);
  61.     free( out );
  62.     free( in );
  63.     return (1);
  64. }
复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2007-02-01 14:51 |只看该作者
请做过的高手讲一下Linux下C解析XML可行性如何?可行/效率/稳定?

完全可行,效率很好,稳定性很好。

论坛徽章:
0
4 [报告]
发表于 2007-02-01 16:51 |只看该作者

再问个问题

我要修改xml节点的某个值为汉字是不是先要转换
如:
http://blog.csdn.net/force_eagle/archive/2005/03/03/309644.aspx
中提到的:
szNode = Convert("gb2312", "utf-8", "测试" );
取出来的时候要相反的转换。
这样做频繁的转换效率会不会很低。

论坛徽章:
0
5 [报告]
发表于 2007-02-01 16:55 |只看该作者

可不可以将XMLDoc直接传输而不生成文件

可不可以将XMLDoc直接传输而不生成文件
因为我是想根据发送过来的数据生成XML消息来进行传输的。
另外Windows端接收到该消息解析应该也没有问题吧

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2007-02-01 17:12 |只看该作者
原帖由 hareqiqi 于 2007-2-1 16:55 发表于 5楼  
可不可以将XMLDoc直接传输而不生成文件
因为我是想根据发送过来的数据生成XML消息来进行传输的。
另外Windows端接收到该消息解析应该也没有问题吧


完全可以直接输出的啊,和普通的http的html输出类似。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
7 [报告]
发表于 2007-02-01 17:12 |只看该作者
原帖由 hareqiqi 于 2007-2-1 16:51 发表于 4楼  
我要修改xml节点的某个值为汉字是不是先要转换
如:
http://blog.csdn.net/force_eagle/archive/2005/03/03/309644.aspx
中提到的:
szNode = Convert("gb2312", "utf-8", "测试& ...


最好的方法,是你的整个系统采用UTF-8。

论坛徽章:
0
8 [报告]
发表于 2007-04-25 15:53 |只看该作者
我用过LIBXML2编解码,在处理中文字符时,是事先将要加为节点的文本进行base64编码,base64编解码比较简单,结合LIBXML2使用感觉效果稳定性都不错
注:我是在电信行业短信操作时用的.建议楼主可试着用一下,编码后的XML文档可直接拿到JAVA里边的工具解码.

论坛徽章:
0
9 [报告]
发表于 2007-04-28 17:23 |只看该作者

回复 #1 hareqiqi 的帖子

我这里有一份关于LINUX下的LINXML的应用,是关于LINUX下C中对XML的操作,要的话,给我你的邮箱

论坛徽章:
0
10 [报告]
发表于 2007-04-29 08:27 |只看该作者

回复 #9 wafeffcs 的帖子

方便的话,也请给我一份 yhp@21cn.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP