加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

TinyXML读取xml文件

发布时间:2020-12-15 23:36:57 所属栏目:百科 来源:网络整理
导读:例子 xml 内容: ?xml version="1.0" encoding="UTF-8" ? Config Database ip="192.168.1.33" port="3306" / List Channel count="5"电视剧/Channel Channel count="5"电影/Channel /List /Config 以下为示例代码,buffer 中保存着上面例子的 xml 内容: [cp

例子 xml 内容:
<?xml version="1.0" encoding="UTF-8" ?>
<Config>
<Database ip="192.168.1.33" port="3306" />
<List>
<Channel count="5">电视剧</Channel>
<Channel count="5">电影</Channel>
</List>
</Config>

以下为示例代码,buffer 中保存着上面例子的 xml 内容:

[cpp] view plain copy
  1. voidCxmlDlg::ParseXML()
  2. {
  3. char*buffer="<?xmlversion="1.0"encoding="UTF-8"?>
  4. <Config>
  5. <Databaseip="192.168.1.33"port="3306"/>
  6. <List>
  7. <Channelcount="5">电视剧</Channel>
  8. <Channelcount="5">电影</Channel>
  9. </List>
  10. </Config>";
  11. charutf8[256]={0};
  12. if(MBSToUTF8(utf8,sizeof(utf8),buffer)<=0)//此函数见我之前关于TinyXML的文章
  13. return;
  14. TiXmlDocumentdoc;
  15. doc.Parse(utf8);
  16. TiXmlElement*databaseElement=0;
  17. TiXmlElement*listElement=0;
  18. TiXmlElement*channelElement=0;
  19. TiXmlHandledocHandle(&doc);
  20. databaseElement=docHandle.FirstChild("Config").FirstChild("Database").ToElement();
  21. assert(databaseElement);
  22. //取得字符串属性的内容
  23. constchar*ip=databaseElement->Attribute("ip");
  24. //取得整型属性的值
  25. intport=0;
  26. databaseElement->QueryIntAttribute("port",&port);
  27. intcount=0;
  28. charcontent[32]={0};
  29. listElement=docHandle.FirstChild("Config").FirstChild("List").ToElement();
  30. assert(listElement);
  31. for(channelElement=listElement->FirstChildElement("Channel");channelElement;channelElement=channelElement->NextSiblingElement("Channel"))
  32. {
  33. channelElement->QueryIntAttribute("count",&count);
  34. UTF8ToMBS(content,sizeof(content),channelElement->GetText());
  35. }
  36. }

注意:

1) xml 内容中如果有中文,必须转成 UTF-8格式,否则可能会出问题,比如此例中,"电视剧"的中文 gb2312 编码会影响到后面的 "</Channel>",导致取这个节点的 text 时,得到的结果是: "电视剧</Channel>",而取下一个节点时将找不到节点。

2)使用 TiXmlDocument 与 TiXmlHandle 的区别: 一次取多级子节点元素时,当某一级节点不存在,用 doc (TiXmlDocument) 会出现异常,程序崩溃,而用 docHandle (TiXmlHandle) 则不会有异常。 比如: databaseElement = doc.FirstChildElement( "Conf" )->FirstChildElement( "Database" ); // 异常,崩溃 databaseElement = docHandle.FirstChild( "Conf" ).FirstChild( "Database" ).ToElement(); // 不会异常,databaseElement 为 0 databaseElement = docHandle.FirstChildElement( "Conf" ).FirstChildElement( "Database" ).ToElement(); // 不会异常,databaseElement 为 0 后两种写法的效果是一样的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读