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>