tinyxml小记
1.声明:
TiXmlDocument *m_pXml; //<!-- Xml parse -->
m_pXml = new TiXmlDocument;
最好用动态生成.
2.加载xml文件:
1.xml:
<?xml version="1.0" encoding="GB2312" standalone="yes"?> <author name="hgy413" sex="man"> text is hgy <childItem1 childname1="hgy"> child text is hgy </childItem1> <childItem2> </childItem2> </author>
//<!-- new codes --> wchar_t wcPath[MAX_PATH] = {0}; ::GetModuleFileName(NULL, wcPath, MAX_PATH); //<!-- convert unicode to asii --> int nLen = WideCharToMultiByte(CP_ACP, 0, wcPath, -1, 0, NULL, NULL, NULL); char *pPath = (char *)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nLen); ::ZeroMemory(pPath, nLen); WideCharToMultiByte(CP_ACP, 0, wcPath, -1, pPath, nLen, NULL, NULL); //<!-- cut \\ tail --> for (int i=nLen-1; i>0; i--) { if ('\\' == pPath[i]) { break; } else { pPath[i] = '\0'; } } char FileName[] = "1.xml"; strcat(pPath, FileName); //----------------------------------------- // 判断XML是否被加载成功,不然清掉对象 //----------------------------------------- if (!m_pXml->LoadFile(pPath)) { delete m_pXml; m_pXml = NULL; }
3.解析:
1 TiXmlDocument:文档类,它代表了整个xml文件。
2TiXmlDeclaration:声明类,它表示文件的声明部分。
3 TiXmlComment:注释类,它表示文件的注释部分。
4TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类。
5 TiXmlAttribute/TiXmlAttributeSet:元素属性,它一般嵌套在元素中,用于记录此元素的一些属性。
6 TiXmlText:文本对象,它嵌套在某个元素内部。
TinyXml使用文档对象模型(DOM)来解析xml文件,这种模型的处理方式为在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,但可以给用户提供一个面向对象的访问接口,对用户更为友好
1 TiXmlDocument:文档类
另存为xml文件:
m_pXml->SaveFile("1.xml");
2TiXmlDeclaration:声明类
//----------------------------------------------------- // 一般来说文档的第一行就是声明对象,你可以把文档对象的第一个子节点转换为声明对象 // <?xml version="1.0" encoding="GB2312" standalone="yes"?> //----------------------------------------------------- TiXmlDeclaration *pDeclare = m_pXml->FirstChild()->ToDeclaration(); if (pDeclare) { pText = pDeclare->Version(); //<!-- pText == "1.0" --> pText = pDeclare->Encoding();//<!-- pText == "GB2312" --> pText = pDeclare->Standalone();//<!-- pText == "yes" --> }
4TiXmlElement:元素类:
元素为一个容器类,它具有元素名称,并可以包含其它元素,文本,注释和未知节点,这些对象统称为元素的节点,即节点可以为元素、文本、注释和未知节点类型。元素也可以包含任意个数的属性
TiXmlElement *pRoot = m_pXml->RootElement();//<!-- author根结点 --> pText = m_pXml->Value(); //<!-- pText =="d:\project\XMLDemo\Debug\1.xml" --> if (pRoot) { pText = pRoot->Value();//<!-- pText == "author" --> //------------------------------------------------------ // 这里和list/tree的遍历相似,先得到第一个值,然后做while循环 //------------------------------------------------------ TiXmlAttribute *pRootAttribute = pRoot->FirstAttribute(); while (pRootAttribute) { pText = pRootAttribute->Name();//<!--第一次: pText =="name", 第二次: pText =="sex"> pText = pRootAttribute->Value();//<!--第一次: pText == "hgy413", 第二次: pText =="man"> pRootAttribute = pRootAttribute->Next(); } //------------------------------------------------------ // 如果直接写成 pRoot->FirstChildElement();返回的是第一个元素 //------------------------------------------------------ char Star[] = "childItem1"; TiXmlElement *pElement = pRoot->FirstChildElement(Star); //<!-- 同样遍历pElement之后的所有元素 --> while (pElement) { TiXmlAttribute *pElementAttribute = pElement->FirstAttribute(); while (pElementAttribute) { pText = pElementAttribute->Name(); pText = pElementAttribute->Value(); pElementAttribute = pElementAttribute->Next(); } pText = pElement->GetText(); //------------------------------------------------------ // NextSiblingElement同样可以写入star,那么查询的是下一个同名的元素位置 //------------------------------------------------------ pElement = pElement->NextSiblingElement(); } }
节点名:
元素函数总结
ValueStr //返回元素名称
SetValue //设置元素名称
Parent //返回父节点对象
FirstChild //返回第一个子节点
LastChild //返回最后一个子节点
IterateChildren //返回下一个子节点
InsertEndChild //在最后一个子节点后插入子节点
InsertBeforeChild //在指定的子节点前插入子节点
InsertAfterChild //在指定的子节点后插入子节点
ReplaceChild //替换指定的子节点
RemoveChild //删除指定的子节点
Clear //删除所有的子节点
PreviousSibling //返回同级中前一个节点
NextSibling //返回同级中后一个节点
NextSiblingElement //返回同级中后一个元素
FirstChildElement //返回第一个子元素节点
Attribute //返回元素中的属性值
QueryValueAttribute //返回元素中的属性值
SetAttribute //设置元素中的属性值
FirstAttribute //返回元素中第一个属性对象
LastAttribute //返回元素中最后一个属性对象
RemoveAttribute //删除元素中指定的属性对象
属性类
属性为名称="值"对,元素可以具有属性值,但名称必须唯一