tinyxml读xml

main.cpp

#include <string>
#include <iostream>
#include <list>


using namespace std;



bool InitNode(TiXmlElement *xmlNode, APNode*& node)//why &
{
	// 1. 读取xmlNode的属性,类型等,明确到底是什么?
	if (xmlNode->Value() == NULL)
	{
		 return false;
	}

	// 2. 类型不同,处理方法不同
	if (strcmp("Part", xmlNode->Value()) == 0)
	{
		node = new PartNode();
		node->type = xmlNode->Value();
		((PartNode*)node)->path = xmlNode->Attribute("path");
		((PartNode*)node)->name = xmlNode->Attribute("name");

	}
	else if (strcmp("Assembly", xmlNode->Value()) == 0)
	{
		node = new AssemblyNode();
		node->type = xmlNode->Value();
		((AssemblyNode*)node)->count = xmlNode->Attribute("children_count");
		((AssemblyNode*)node)->name = xmlNode->Attribute("name");
	}
	else if (strcmp("scene_root", xmlNode->Value()) == 0)
	{
		node = new SceneNode();
		((SceneNode*)node)->type = xmlNode->Value();
		((SceneNode*)node)->name = xmlNode->Attribute("name");
		((SceneNode*)node)->description = xmlNode->Attribute("description");
		((SceneNode*)node)->count = xmlNode->Attribute("children_count");
	}
	return true;
	// 2.1 new一个AssemlyNode

	// 2.2 new一个PartNode

	// 3. 赋值	

	// 4. 如果需要,调用readstl
}




void BrowseChildren(TiXmlElement *parent, APNode*& headNode)
{
	TiXmlElement* child = parent->FirstChildElement();			// 得到第一个孩子节点
	while (child != NULL)							// 如果孩子节点不为空
	{
		APNode* pNode;
	     InitNode(child, pNode);
		 //static_cast<AssemblyNode*>(headNode)->m_pListChildren.push_back(pNode);
		 ((SceneNode*)headNode)->m_pListChildren.push_back(pNode);


		// 不能仅仅判断pNode是空,应该判断pNode的类型等信息
		if (pNode->type != "Part")
		{
			BrowseChildren(child, pNode);
		}
		child = child->NextSiblingElement();		// 找到下一个孩子节点
	}
}

bool ReadXML(char* path, APNode*& root)
{
	TiXmlDocument doc(path);							//打开XML文件
	if (!doc.LoadFile())											//检测打开是否成功
	{
		root = NULL;
		return	false;
	}

	TiXmlElement *xmlRoot = doc.RootElement();			//根元素
	//root = InitNode(xmlRoot, root);
	if (!InitNode(xmlRoot, root))
	{
		 root = NULL;
		 return true;
	}

	BrowseChildren(xmlRoot, root);
	//输出验证一下把东西装里面没?
	cout << static_cast<SceneNode*>(root)->m_pListChildren.size() << endl;;
   list<APNode*>::iterator it = static_cast<SceneNode*>(root)->m_pListChildren.begin();
   list<APNode*>::iterator itEnd = static_cast<SceneNode*>(root)->m_pListChildren.end();

   cout << "AssemblyNode size is " << static_cast<AssemblyNode*>(*it)->m_pListChildren.size() << endl;
  
   *it = static_cast<SceneNode*>(root)->m_pListChildren.back();
   cout << "name is " << static_cast<PartNode*>(*it)->name << endl
		   << "type is " << static_cast<PartNode*>(*it)->type << endl
		   << "path is " << static_cast<PartNode*>(*it)->path << endl;

	return true;
}



void main()
{


	APNode*  m_APNode = new APNode();

	ReadXML("example.xml", m_APNode);		// void ReadXML(string path, AssemblyNode* root)
	cout << static_cast<SceneNode*>(m_APNode)->m_pListChildren.size() << endl;

	//	list<APNode*>::iterator it = sence_Root->m_pListChildren.begin(); //有可能assemblynode 和partnode是并列的  

	//for (; it != sence_Root->m_pListChildren.end(); it++)
	//{
	//	
	//}
}

example.xml


<?xml version="1.0" encoding="utf-8"?>
<scene_root name = "Scene" children_count="3" description = "SimpleSence">
	<Assembly children_count="2" name="BuJian1">
		<Assembly children_count="3" name="BuJian1-1">
			<Assembly children_count="2" name="BuJian1-1-1">
				<Part path="data/a.stl" name="LingJian1">
				</Part>
				<Part path="data/b.stl" name="LingJian2">
				</Part>
			</Assembly>
			<Part path="data/c.stl" name="LingJian3">
			</Part>
			<Part path="data/a.stl" name="LingJian4">
			</Part>
		</Assembly>
		<Part path="data/b.stl" name="LingJian5">
		</Part>
	</Assembly>
	<Part path="data/c.stl" name="LingJian5">
	</Part>
	<Part path="data/c.stl" name="LingJian6">
	</Part>
</scene_root>

猜你喜欢

转载自blog.csdn.net/moonlightpeng/article/details/80201280