TinyXML指南Word格式.docx
《TinyXML指南Word格式.docx》由会员分享,可在线阅读,更多相关《TinyXML指南Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
example3.xml:
shapes>
circlename="
int-based"
x="
20"
y="
30"
r="
50"
/>
pointname="
float-based"
3.5"
52.1"
/shapes>
example4.xml:
MyApp>
!
--SettingsforMyApp-->
Messages>
Welcome>
WelcometoMyApp<
/Welcome>
Farewell>
ThankyouforusingMyApp<
/Farewell>
/Messages>
Windows>
Windowname="
MainFrame"
5"
15"
w="
400"
h="
250"
/Windows>
Connectionip="
192.168.0.1"
timeout="
123.456000"
/MyApp>
开始起步
从文件加载XML
将一个文件加载到TinyXMLDOM中的最简单方法:
TiXmlDocumentdoc("
demo.xml"
);
doc.LoadFile();
下面是一个更实际的用法。
它会加载文件并在标准输出中显示文件内容:
//loadthenamedfileanddumpitsstructuretoSTDOUT
voiddump_to_stdout(constchar*pFilename)
{
TiXmlDocumentdoc(pFilename);
boolloadOkay=doc.LoadFile();
if(loadOkay)
printf("
\n%s:
\n"
pFilename);
dump_to_stdout(&
doc);
//definedlaterinthetutorial
}
else
Failedtoloadfile\"
%s\"
这是在main()函数中使用这个函数的简单示例:
intmain(void)
dump_to_stdout("
example1.xml"
);
return0;
Example1的XML是:
运行这个程序就可以将XML文件显示在控制台或DOS窗口中:
DOCUMENT
+DECLARATION
+ELEMENTHello
+TEXT[World]
在本指南的后面会给出dump_to_stdout()函数的定义,它对你了解如何递归遍历一个DOM十分有用。
通过编程建立XML文档
下面的函数可以建立Example1文档:
voidbuild_simple_doc()
//Makexml:
<
xml..>
TiXmlDocumentdoc;
TiXmlDeclaration*decl=newTiXmlDeclaration("
"
"
TiXmlElement*element=newTiXmlElement("
Hello"
TiXmlText*text=newTiXmlText("
World"
element->
LinkEndChild(text);
doc.LinkEndChild(decl);
doc.LinkEndChild(element);
doc.SaveFile("
madeByHand.xml"
可以通过下面的调用来加载文件并将它显示在控制台上:
//thisfuncdefinedlaterinthetutorial
你会发现它和Example1是完全一样的:
madeByHand.xml:
Document
+Declaration
+Element[Hello]
+Text:
[World]
下面这段代码通过节点的建立和连接的不同顺序生成一个完全相同的XMLDOM:
voidwrite_simple_doc2()
//sameaswrite_simple_doc1butaddeachnode
//asearlyaspossibleintothetree.
madeByHand2.xml"
这两段代码生成的是同一段XML,如下:
也就是这种结构形式:
属性
很简单就可以给一个已经存在的节点设置属性:
window=newTiXmlElement("
Demo"
window->
SetAttribute("
name"
Circle"
x"
5);
y"
15);
SetDoubleAttribute("
radius"
3.14159);
你也可以使用TiXmlAttribute对象来做这件事。
下面这段代码给出了一种(并非仅此一种)如何得到一个元素的所有属性,然后打印出名字和字符串值的方法,并且,如果这些值可以转换成整形或浮点型,那么把他们也打印出来:
//printallattributesofpElement.
//returnsthenumberofattributesprinted
intdump_attribs_to_stdout(TiXmlElement*pElement,unsignedintindent)
if(!
pElement)return0;
TiXmlAttribute*pAttrib=pElement->
FirstAttribute();
inti=0;
intival;
doubledval;
constchar*pIndent=getIndent(indent);
while(pAttrib)
printf("
%s%s:
value=[%s]"
pIndent,pAttrib->
Name(),pAttrib->
Value());
if(pAttrib->
QueryIntValue(&
ival)==TIXML_SUCCESS)printf("
int=%d"
ival);
QueryDoubleValue(&
dval)==TIXML_SUCCESS)printf("
d=%1.1f"
dval);
i++;
pAttrib=pAttrib->
Next();
returni;
将文档写入文件
将建立好的DOM写入一个文件很简单:
doc.SaveFile(saveFilename);
回想一下example4:
下面的函数用来建立这个DOM并把它写进一份名为"
appsettings.xml"
的文件中:
voidwrite_app_settings_doc()
{
TiXmlElement*msg;
TiXmlDeclaration*decl=newTiXmlDeclaration("
TiXmlElement*root=newTiXmlElement("
MyApp"
doc.LinkEndChild(root);
TiXmlComment*comment=newTiXmlComment();
comment->
SetValue("
SettingsforMyApp"
root->
LinkEndChild(comment);
TiXmlElement*msgs=newTiXmlElement("
Messages"
LinkEndChild(msgs);
msg=newTiXmlElement("
Welcome"
msg->
LinkEndChild(newTiXmlText("
WelcometoMyApp"
));
msgs->
LinkEndChild(msg);
Farewell"
ThankyouforusingMyApp"
TiXmlElement*windows=newTiXmlElement("
Windows"
LinkEndChild(windows);
TiXmlElement*window;
Window"
windows->
LinkEndChild(window);
w"
400);
h"
250);
TiXmlElement*cxn=newTiXmlElement("
Connection"
LinkEndChild(cxn);
cxn->
ip"
timeout"
123.456);
//floatingpointattrib
}
通过dump_to_stdout()函数可以显示这个结构:
+Element[MyApp]
(Noattributes)
+Comment:
[SettingsforMyApp]
+Element[Messages]
+Element[Welcome]
[WelcometoMyApp]
+Element[Farewell]
[ThankyouforusingMyApp]
+Element[Windows]
+Element[Window]
+name:
value=[MainFrame]
+x:
value=[5]int=5d=5.0
+y:
value=[15]int=15d=15.0
+w:
value=[400]int=400d=400.0
+h:
value=[250]int=250d=250.0
5attributes
+Element[Connection]
+ip:
value=[192.168.0.1]int=192d=192.2
+timeout:
value=[123.456000]int=123d=123.5
2attributes
很高兴在默认的情况下,TinyXml用其他的API所谓的“优美”格式来写XML,它修改元素文字的空白,然后用嵌套层次的方式显示这棵树。
我没有注意到在写文件的时候是否有办法关掉缩排,但是这肯定很容易。
[Lee:
在STL模式下很容易,只要使用cout<
myDoc就可以了。
非STL模式通常是“优美”格式的。
加入一个“开关”会是一个不错的特性,并且已经这么做了。
]
XML与C++对象之间的转换
介绍
这个示例假定你正要加载你的应用设置并把它们保存在XML文件中,就像example4.xml那样。
有许多办法可以完成这件事。
例如,看一看TinyBind这个工程,你可以在这里找到它:
本节给出一个使用XML来加载并保存一个基本的对象结构的浅显易懂的方法。
建立你的对象类
先从下面的这些基类入手:
#include<
string>
map>
usingnamespacestd;
typedefstd:
:
map<
std:
string,std:
MessageMap;
//abasicwindowabstraction-demopurposesonly
classWindowSettings
public:
intx,y,w,h;
stringname;
WindowSettings()
x(0),y(0),w(100),h(100),name("
Untitled"
)
WindowSettings(intx,inty,intw,inth,conststring&
name)
this->
x=x;
y=y;
w=w;
h=h;
name=name;
};
classConnectionSettings
stringip;
doubletimeout;
classAppSettings
stringm_name;
MessageMapm_messages;
list<
WindowSettings>
m_windows;
ConnectionSettingsm_connection;
AppSettings(){}
voidsave(constchar*pFilename);
voidload(constchar*pFilename);
//justtoshowhowtodoit
voidsetDemoValues()
m_name="
;
m_messages.clear();
m_messages["
]="
Welcometo"
+m_name;
Thankyouforusing"
m_windows.clear();
m_windows.push_back(WindowSettings(15,15,400,250,"
Main"
));
m_connection.ip="
Unknown"
m_connection.timeout=123.456;
这是一个简化的main()函数,它演示了如何建立一个默认设置的树的对象,保存它以及重新载入它:
AppSettingssettings;
settings.save("
appsettings2.xml"
settings.load("
下面这个main()函数演示了如何建立,修改,保存,还有加载一个结构体:
//block:
customiseandsavesettings
settings.m_name="
HitchHikerApp"
settings.m_messages["
Don'
tPanic"
Th