例子 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 内容:
- voidCxmlDlg::ParseXML()
- {
- char*buffer="<?xmlversion="1.0"encoding="UTF-8"?>
- <Config>
- <Databaseip="192.168.1.33"port="3306"/>
- <List>
- <Channelcount="5">电视剧</Channel>
- <Channelcount="5">电影</Channel>
- </List>
- </Config>";
-
- charutf8[256]={0};
- if(MBSToUTF8(utf8,sizeof(utf8),buffer)<=0)
- return;
-
- TiXmlDocumentdoc;
- doc.Parse(utf8);
- TiXmlElement*databaseElement=0;
- TiXmlElement*listElement=0;
- TiXmlElement*channelElement=0;
- TiXmlHandledocHandle(&doc);
- databaseElement=docHandle.FirstChild("Config").FirstChild("Database").ToElement();
- assert(databaseElement);
-
- constchar*ip=databaseElement->Attribute("ip");
-
- intport=0;
- databaseElement->QueryIntAttribute("port",&port);
- intcount=0;
- charcontent[32]={0};
- listElement=docHandle.FirstChild("Config").FirstChild("List").ToElement();
- assert(listElement);
- for(channelElement=listElement->FirstChildElement("Channel");channelElement;channelElement=channelElement->NextSiblingElement("Channel"))
- {
- channelElement->QueryIntAttribute("count",&count);
- UTF8ToMBS(content,sizeof(content),channelElement->GetText());
- }
- }
注意:
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 后两种写法的效果是一样的。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|