在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
例如:
<?
xml version="1.0" standalone=no>
<!– Our to do list data –>
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo>
<!– Our to do list data –>
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo>
整个对象树:
TiXmlDocument "demo.xml"
TiXmlDeclaration "version=’1.0′" "standalone=no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority = 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority=2
TiXmlText "Do bills"
在tinyXML中,用FirstChild("名字")查找节点时,调用FirstChild函数的节点与要查找的节点必须成“父子关系”。
句柄
想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码:
TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
TiXmlElement* element = root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement* child = element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement* child2 = child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful.
if ( root )
{
TiXmlElement* element = root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement* child = element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement* child2 = child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful.
用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:
TiXmlHandle docHandle( &
document );
TiXmlElement * child2 = docHandle.FirstChild( " Document " ).FirstChild( " Element " ).Child( " Child " , 1 ).ToElement();
if ( child2 )
{
// do something useful
TiXmlElement * child2 = docHandle.FirstChild( " Document " ).FirstChild( " Element " ).Child( " Child " , 1 ).ToElement();
if ( child2 )
{
// do something useful
}
2.读取XML文件
如读取文件a.xml:
<ToDo>
<Item priority="1">
<bold>
Book store!
</bold>
</Item>
<Item priority="2">
book1
</Item>
<Item priority="2">
book2
</Item>
</ToDo>
读取代码如下:
1 #include "tinyxml.h" 2 #include <iostream> 3 #include <string> 4 5 using namespace std; 6 7 enum SuccessEnum {FAILURE, SUCCESS}; 8 9 SuccessEnum loadXML() 10 { 11 TiXmlDocument doc; 12 if(!doc.LoadFile("a.xml")) 13 { 14 cerr << doc.ErrorDesc() << endl; 15 return FAILURE; 16 } 17 18 TiXmlElement* root = doc.FirstChildElement(); 19 if(root == NULL) 20 { 21 cerr << "Failed to load file: No root element." << endl; 22 doc.Clear(); 23 return FAILURE; 24 } 25 26 for(TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement()) 27 { 28 string elemName = elem->Value(); 29 const char* attr; 30 attr = elem->Attribute("priority"); 31 if(strcmp(attr,"1")==0) 32 { 33 TiXmlElement* e1 = elem->FirstChildElement("bold"); 34 TiXmlNode* e2=e1->FirstChild(); 35 cout<<"priority=1\t"<<e2->ToText()->Value()<<endl; 36 37 } 38 else if(strcmp(attr,"2")==0) 39 { 40 TiXmlNode* e1 = elem->FirstChild(); 41 cout<<"priority=2\t"<<e1->ToText()->Value()<<endl; 42 } 43 } 44 doc.Clear(); 45 return SUCCESS; 46 } 47 48 int main(int argc, char* argv[]) 49 { 50 if(loadXML() == FAILURE) 51 return 1; 52 return 0; 53 }