VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 983|回复: 10

[求助] 求大神指点读取XML文件

[复制链接]
53_avatar_middle
在线会员 发表于 2015-12-20 10:56:36 | 显示全部楼层 |阅读模式
3驿站币
XML文件中的部分内容如下,在这段<OBJECTS>中,我需要提取POINT X的坐标,以及PointName和CroodX的内容,常规的通过循环对CString进行查抄提取子字符串效率太低,不知道对XML文件有没有更高效简便的办法,求高手指点,万分感谢!

<OBJECTS>
<OBJECT ObjID="96F5202569804D21B343ABC7F0664EED" ObjType="41" ObjName="轨迹" RotateAngle="0" Displayed="true" DepthScale="0" ConstY="0" PianyiX="0" PianyiY="0" IsClip="false">
<POINTS PointCount="77">
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
<POINT X="20503726" Y="4108210.8"/>
</POINTS>
<clipPOINTS PointCount="0"/>
<PointTrace LineWidth="1" LineColor="255" LineStyle="2" PointName="P0001" CroodX="20503726" CroodY="4108210.8" DotSize="3" PointJdcd="2" PointNameIsDisplay="false" SymbolName="" SymbolCode="" SymbolID="" PointLabelposType="0" PointTraceShowType="0">...</PointTrace>
</OBJECT>

PS:这只是文件中的一段,还有很大篇这样的点和线数,需要找到效率比较高的读取和存储方式,使用常规的数组或者字符串保存都不太理想





上一篇:SYC老大,请你指点一下
下一篇:CArray可以作为函数的返回值吗?
69_avatar_middle
在线会员 发表于 2015-12-20 11:46:36 | 显示全部楼层
可以用TinyXml    Duilib用的就是Tinyxml
51_avatar_middle
online_admins 发表于 2015-12-20 21:28:52 | 显示全部楼层
楼上正解,使用 XML 的解析类来读取XML相关的键值就方便多了
53_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 15:41:51 | 显示全部楼层
mjy194 发表于 2015-12-20 11:46
可以用TinyXml    Duilib用的就是Tinyxml

谢谢,不过下载TinyXML后,源代码,看的一塌糊涂求大神指点读取XML文件
53_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 15:43:58 | 显示全部楼层
Syc 发表于 2015-12-20 21:28
楼上正解,使用 XML 的解析类来读取XML相关的键值就方便多了

谢谢老大来回复俺的帖子!不过对俺来说XML解析类短时间内难以掌握,还是老老实实用CString来定位,用fstream来读取,效率勉强可以接受
69_avatar_middle
在线会员 发表于 2015-12-23 21:30:35 | 显示全部楼层
ljupcn 发表于 2015-12-23 15:41
谢谢,不过下载TinyXML后,源代码,看的一塌糊涂

应该不是很难吧   XML 我没做过  我做过JSON
43_avatar_middle
在线会员 发表于 2016-4-8 15:27:22 | 显示全部楼层
pugixml.org
这个简单点,就3个文件,用法也简单。
74_avatar_middle
在线会员 发表于 2016-4-12 22:44:00 | 显示全部楼层
boost::property_tree 应该是c++下 最好用的 xml解析器
20_avatar_middle
在线会员 发表于 2016-4-21 23:50:36 | 显示全部楼层
  1. // TtinyxmlConsole.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include "tinyxml/tinyxml.h"
  5. #include <string.h>
  6. void dump_to_stdout(const char* pFilename);
  7. void build_simple_doc();
  8. int _tmain(int argc, _TCHAR* argv[])
  9. {
  10.         //建立数据文档
  11.         build_simple_doc();
  12.         //读取数据文档
  13.         TiXmlDocument doc;
  14.         doc.LoadFile("setaddress.xml");
  15.         doc.Print();
  16.         /*TiXmlDeclaration * decl=doc.FirstChild();*/
  17.         TiXmlDeclaration * decl=doc.FirstChild()->ToDeclaration();
  18.        
  19.         cout <<"版本:"<<decl->Version()<<"\t编码:"<<decl->Encoding()<<"\t是否独立文档:"<<decl->Standalone()<<endl;
  20.         TiXmlElement * e_Localaddr=doc.FirstChildElement();
  21.         /*cout <<e_Localaddr->ToElement() <<endl;*/
  22.         /*cout <<e_Localaddr->ToText() <<endl ;*/
  23.         cout<<"本地IP地址"<<e_Localaddr->GetText()<<endl;
  24.         TiXmlElement *e_MCAddr =e_Localaddr->NextSiblingElement();
  25.         cout<<"远程IP地址"<<e_MCAddr->GetText()<<endl;
  26.         cout <<"结束处"<<endl;
  27.         int i;
  28.         cin>>i;
  29.         return 0;
  30. }
  31. //打印数据到端口
  32. void dump_to_stdout(const char* pFilename)
  33. {
  34.         TiXmlDocument doc(pFilename);
  35.         bool loadOkay = doc.LoadFile();
  36.         if (loadOkay)
  37.         {
  38.                 printf("\n%s:\n", pFilename);
  39.                 dump_to_stdout((char *)&doc ); // defined later in the tutorial

  40.         }
  41.         else
  42.         {
  43.                 printf("Failed to load file "%s"\n", pFilename);
  44.         }
  45. }
  46. //创建数据到文档
  47. void build_simple_doc( )
  48. {
  49.         //建立DOC文档
  50.         TiXmlDocument doc;
  51.        
  52.         //建立描述信息
  53.         TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "Unicode", "yes" );
  54.         //标记本地地址节点
  55.         TiXmlElement * e_Localaddr = new TiXmlElement( "Localaddr" );
  56.         //标记本地地址节点
  57.         TiXmlText * v_Localaddr = new TiXmlText( "127.0.0.1" );
  58.         e_Localaddr->LinkEndChild( v_Localaddr );
  59.         //标记远程数据
  60.         TiXmlElement *e_MCAddr= new TiXmlElement("MCAddr") ;
  61.         TiXmlText *v_MCAddr = new TiXmlText( "127.0.0.2" );
  62.         e_MCAddr->LinkEndChild( v_MCAddr ) ;


  63.         doc.LinkEndChild( decl );
  64.         doc.LinkEndChild( e_Localaddr );
  65.         doc.LinkEndChild( e_MCAddr ) ;
  66.         //标记型号
  67.         TiXmlElement *e_MCType =new TiXmlElement("MCType") ;
  68.         doc.LinkEndChild( e_MCType ) ;
  69.         TiXmlElement *e_MC4N = new TiXmlElement( "MC4N") ;
  70.         e_MCType->LinkEndChild( e_MC4N ) ;
  71.         e_MC4N->SetAttribute("Version","2.0263");
  72.         e_MC4N->SetAttribute("Firware","P876") ;

  73.        
  74.         doc.SaveFile( "setaddress.xml" );
  75. }


复制代码


菜鸟写的读取XML读写,和你分享
20_avatar_middle
在线会员 发表于 2016-4-21 23:51:52 | 显示全部楼层
搞个TINYXML去读取它
53_avatar_middle
ico_lz  楼主| 发表于 2016-5-31 10:45:14 | 显示全部楼层
g_trio 发表于 2016-4-21 23:50
菜鸟写的读取XML读写,和你分享

多谢兄弟指点,我回头好好琢磨琢磨
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-27 16:27

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表