TinyXML 指南
注: 本文是 TinyXML 2.5.3 版本 Document 中的《TinyXML Tutorial》的翻译文档,由本人
Dennis.Gao 翻译,版权归原作者所有,转载本文档请注明出处。原文出自 TinyXML 源码包 doc
目录。在线文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html
Author : Dennis.Gao
Date : 2008.01.01
这是什么?
本指南就如何有效的使用 TinyXML 提供一些窍门和建议。
这里也会包括一些 C++ 的窍门,像如何在字符串和整数之间进行转换。这和 TinyXML 本身并没
有任何关系,但是它会对你的工程有所帮助,所以我把它写了进来。
如果你不知道 C++ 的基本概念,那么本指南对你没有任何用处。同样,如果你不知道 DOM 是什
么,先在别的地方学习一下吧。
开始之前
一些 XML 数据集/文件将会被用到:
example1.xml:
World
example2.xml:
Alas
Great World
Alas (again)
example3.xml:
example4.xml:
Welcome to MyApp
Thank you for using MyApp
开始起步
从文件加载 XML
将一个文件加载到 TinyXML DOM 中的最简单方法:
TiXmlDocument doc( "demo.xml" );
doc.LoadFile();
下面是一个更实际的用法。它会加载文件并在标准输出中显示文件内容:
// load the named file and dump its structure to STDOUT
void dump_to_stdout(const char* pFilename)
{
TiXmlDocument doc(pFilename);
bool loadOkay = doc.LoadFile();
if (loadOkay)
{
printf("\n%s:\n", pFilename);
dump_to_stdout( &doc ); // defined later in the
tutorial
}
else
{
printf("Failed to load file \"%s\"\n", pFilename);
}
}
这是在 main() 函数中使用这个函数的简单示例:
int main(void)
{
dump_to_stdout("example1.xml");
return 0;
}
Example 1 的 XML 是:
World
运行这个程序就可以将 XML 文件显示在控制台或 DOS 窗口中:
DOCUMENT
+ DECLARATION
+ ELEMENT Hello
+ TEXT[World]
在本指南的后面会给出 dump_to_stdout() 函数的定义,它对你了解如何递归遍历一个 DOM 十
分有用。
通过编程建立 XML 文档
下面的函数可以建立 Example 1 文档:
void build_simple_doc( )
{
// Make xml: World
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "",
"" );
TiXmlElement * element = new TiXmlElement( "Hello" );
TiXmlText * text = new TiXmlText( "World" );
element->LinkEndChild( text );
doc.LinkEndChild( decl );
doc.LinkEndChild( element );
doc.SaveFile( "madeByHand.xml" );
}
可以通过下面的调用来加载文件并将它显示在控制台上:
dump_to_stdout("madeByHand.xml"); // this func defined later in the
tutorial
你会发现它和 Example 1 是完全一样的:
madeByHand.xml:
Document
+ Declaration
+ Element [Hello]
+ Text: [World]
下面这段代码通过节点的建立和连接的不同顺序生成一个完全相同的 XML DOM :
void write_simple_doc2( )
{
// same as write_simple_doc1 but add each node
// as early as possible into the tree.
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "",
"" );
doc.LinkEndChild( decl );
TiXmlElement * element = new TiXmlElement( "Hello" );
doc.LinkEndChild( element );
TiXmlText * text = new TiXmlText( "World" );
element->LinkEndChild( text );
doc.SaveFile( "madeByHand2.xml" );
}
这两段代码生成的是同一段 XML ,如下:
World
也就是这种结构形式:
DOCUMENT
+ DECLARATION
+ ELEMENT Hello
+ TEXT[World]
属性
很简单就可以给一个已经存在的节点设置属性:
window = new TiXmlElement( "Demo" );
window->SetAttribute("name", "Circle");
window->SetAttribute("x", 5);
window->SetAttribute("y", 15);
window->SetDoubleAttribute("radius", 3.14159);
你也可以使用 TiXmlAttribute 对象来做这件事。
下面这段代码给出了一种(并非仅此一种)如何得到一个元素的所有属性,然后打印出名字和字
符串值的方法,并且,如果这些值可以转换成整形或浮点型,那么把他们也打印出来:
// print all attributes of pElement.
// returns the number of attributes printed
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int
indent)
{
if ( !pElement ) return 0;
TiXmlAttribute* pAttrib=pElement->FirstAttribute();
int i=0;
int ival;
double dval;
const char* pIndent=getIndent(indent);
printf("\n");
while (pAttrib)
{
printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(),
pAttrib->Value());
if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)
printf( " int=%d", ival);
if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS)
printf( " d=%1.1f", dval);
printf( "\n" );
i++;
pAttrib=pAttrib->Next();
}
return i;
}
将文档写入文件
将建立好的 DOM 写入一个文件很简单:
doc.SaveFile( saveFilename );
回想一下 example 4:
Welcome to MyApp
Thank you for using MyApp
下面的函数用来建立这个 DOM 并把它写进一份名为 "appsettings.xml" 的文件中:
void write_app_settings_doc( )
{
TiXmlDocument doc;
TiXmlElement* msg;
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "",
"" );
doc.LinkEndChild( decl );
TiXmlElement * root = new TiXmlElement( "MyApp" );
doc.LinkEndChild( root );
TiXmlComment * comment = new TiXmlComment();
comment->SetValue(" Settings for MyApp " );
root->LinkEndChild( comment );
TiXmlElement * msgs = new TiXmlElement( "Messages" );
root->LinkEndChild( msgs );
msg = new TiXmlElement( "Welcome" );
msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));
msgs->LinkEndChild( msg );
msg = new TiXmlElement( "Farewell" );
msg->LinkEndChild( new TiXmlText( "Thank you for using
MyApp" ));