TinyXML读取xml文件

前端之家收集整理的这篇文章主要介绍了TinyXML读取xml文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

例子 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 内容

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

注意:

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 后两种写法的效果是一样的。

猜你在找的XML相关文章