tinyXML 学习笔记1

来源:互联网 发布:安阳淘宝培训班 编辑:程序博客网 时间:2024/05/19 23:04

先贴上学习的教程资源http://hi.baidu.com/vc_net/blog/item/5408820249c764004afb510b.html#0  此博主非常勤奋 自勉


//打开xml文件过程
string filename ="first.xml";////默认位置是当前工程目录下
std::ifstream ifs(filename.c_str());
//在使用buffer时出现了test dword ptr [eax],eax ; probe page. 错误 这是buffer太大 内存溢出
char buffer[1024000]; //注:此内存一定要足够大,至少比存进来的数据大即可
char c, *p = buffer;


//循环获取xml文件中字符到buffer中
while(ifs.get(c)) //类似getc
{
*p++=c;
}
*p = 0;
ifs.close(); //关闭缓冲流
//输出
  cout<<buffer<<endl; //此处是源码


//步骤2-1:------>用tinyxml解析出buffer内的信息
TiXmlDocument* doc = new TiXmlDocument(); //创建TiXmlDocument对象
if(!doc->Parse(buffer))//解析内存缓冲区的信息给doc调用----------------------傻瓜式的,知道此函数这么调用即可,后面就不重复说明了
{cout << doc->ErrorDesc() << endl;}//如果解析错误,则输出错误信息


const TiXmlElement* root = doc->RootElement(); //获取根节点,即<Scene>

for( const TiXmlNode* child = root->FirstChild();child;child=child->NextSibling())//循环获取该根节点下面的节点,参数2代表child为真,即有值时才会运行,否则退出
{
//判断为元素类型并且是staticbox元素,Value()获取该标签的名称
if((child->Type() == TiXmlNode::TINYXML_ELEMENT) && (!strcmp(child->Value(),"staticbox")))
{
double px, py, pz;double dx, dy, dz;
const TiXmlElement *box = (const TiXmlElement*)child; //把child指针传给box一份,让box来处理

//获取属性值
std::string mesh;mesh = box->Attribute("mesh");


//继续循环获取子节点相关数据
for(const TiXmlNode *sub_tag = box->FirstChild(); sub_tag; sub_tag = sub_tag->NextSibling() )
{
if(sub_tag->Type() == TiXmlNode::TINYXML_ELEMENT)//下面就开始获取值了
{
const TiXmlElement *sub_element = (const TiXmlElement*)sub_tag;

if(!strcmp(sub_tag->Value(),"position"))
{
px = (sub_element->Attribute("x",&px))?px:0.0;
py = (sub_element->Attribute("y",&py))?py:0.0;
pz = (sub_element->Attribute("z",&pz))?pz:0.0;
}
else if(!strcmp(sub_tag->Value(),"dimension"))
{
dx = (sub_element->Attribute("x",&dx))?dx:1.0;
dy = (sub_element->Attribute("y",&dy))?dy:1.0;
dz = (sub_element->Attribute("z",&dz))?dz:1.0;
}
else if(!strcmp(sub_tag->Value(),"test"))
{
//使用GetText()方法来获取该标签的值,如这里获取的是test的值1和2
string temp = sub_element->GetText();
cout<<"111111111111111:"<<temp<<endl;//这一步能找到test结点的值
}
}
}
//输出部分
cout << "<StaticBox>\n";
cout << "\tPosition = (" << px << ", " << py << ", " << pz << ")\n";
cout << "\tDimension = (" << dx << ", " << dy << ", " << dz << ")\n\n";

}
}

delete doc;