Are you patient, careful, and capable of execution?
tingXml
Download: https://sourceforge.net/projects/tinyxml/
read (parse XML)
try
{
//TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());//这样最后要delete myDocument
//myDocument->LoadFile();
TiXmlDocument doc;
//doc.LoadFile("info.xml");
string str("<Persons>\
<Person ID = '1' other = 'info'>\
<name>Michael</name>\
<age>23</age>\
</Person>\
</Persons>");
doc.Parse(str.c_str());//解析xml字符串
TiXmlElement *RootElement = doc.RootElement();
string root = RootElement->Value();
TiXmlElement *FirstPerson = RootElement->FirstChildElement();
TiXmlElement *NameElement = FirstPerson->FirstChildElement();
TiXmlElement *AgeElement = NameElement->NextSiblingElement();
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
string name = NameElement->FirstChild()->Value();//或NameElement->GetText()
string age = AgeElement->FirstChild()->Value();//或AgeElement->GetText()
string attrName = IDAttribute->Name(); //"ID"
string attrValue = IDAttribute->Value(); //"1"
attrName = IDAttribute->Next()->Name(); //"other"
attrValue = IDAttribute->Next()->Value();//"info"
//delete myDocument;
}
catch (string& e)
{
return false;
}
return true;
write (generate XML)
try
{
TiXmlDocument *myDocument = new TiXmlDocument();
TiXmlElement *RootElement = new TiXmlElement("Persons");
myDocument->LinkEndChild(RootElement);
TiXmlElement *PersonElement = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);
PersonElement->SetAttribute("ID", "1");
PersonElement->SetAttribute("other", "info");
TiXmlElement *NameElement = new TiXmlElement("name");
TiXmlElement *AgeElement = new TiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
TiXmlText *NameContent = new TiXmlText("Michael");
TiXmlText *AgeContent = new TiXmlText("23");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
CString appPath = GetAppPath();
string seperator = "\\";
string fullPath = appPath.GetBuffer(0) + seperator + szFileName;
myDocument->SaveFile(fullPath.c_str());
delete myDocument;
}
catch (string& e)
{
return false;
}
return true;
Comprehensive Case: Reading and Writing XML
<?xml version="1.0" encoding="utf-8" ?>
<!--this is a comment.-->
<books>
<book category="children" language="English" name="123English">
<title>Harry Potter</title>
<anthor>J.K. Rowling</anthor>
<price>29.99</price>
</book>
<function>
<![CDATA[bool cmp(int a,int b)
{return a<b;}]]>
</function>
</books>
try
{
TiXmlDocument* doc = new TiXmlDocument;
TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "utf-8", "");
doc->LinkEndChild(decl);
TiXmlComment* pComment = new TiXmlComment("this is a comment.");
doc->LinkEndChild(pComment);
TiXmlElement *root, *elem, *child;
TiXmlText *text;
root = new TiXmlElement("books");
doc->LinkEndChild(root);
elem = new TiXmlElement("book");
elem->SetAttribute("category", "children");
elem->SetAttribute("language", "English");
elem->SetAttribute("name", "123English");//可以解出来123,但“English123”不能
root->LinkEndChild(elem);
child = new TiXmlElement("title");
text = new TiXmlText("Harry Potter");
child->LinkEndChild(text);
elem->LinkEndChild(child);
child = new TiXmlElement("anthor");
text = new TiXmlText("J.K. Rowling");
child->LinkEndChild(text);
elem->LinkEndChild(child);
child = new TiXmlElement("price");
text = new TiXmlText("29.99");
child->LinkEndChild(text);
elem->LinkEndChild(child);
//一个CDATA(Tixml看做是TiXmlText)
elem = new TiXmlElement("function");
TiXmlText* pCDATA = new TiXmlText("bool cmp(int a,int b)\n{return a<b;}");
pCDATA->SetCDATA(true);
elem->LinkEndChild(pCDATA);
root->LinkEndChild(elem);
//doc->Print();//打印到 stdout cout
doc->SaveFile("D:\\test.xml");//输出到文件
TiXmlPrinter printer;
//printer.SetStreamPrinting();//有这句,无空白符,就一行字符串
doc->Accept(&printer);
string sRet = printer.CStr();//输出到字符串
delete doc;//只需要这一个delete,它的所有子节点都delete了
{
//解析
string sXml = sRet;
TiXmlDocument doc;
解析xml字符串
//doc.Parse(sXml.c_str());
//if (doc.Error())
// return false;
//解析xml文件
if (!doc.LoadFile("D:\\test.xml"))
return false;
TiXmlElement* root = doc.RootElement();
TiXmlElement* elem = root->FirstChildElement();
//遍历
for (TiXmlElement* tmp = elem->FirstChildElement(); tmp; tmp = tmp->NextSiblingElement())
{
string s = tmp->Value();
const char* p = tmp->GetText();
string t(p ? p : "");
}
//查找特定name的元素
TiXmlElement* elem2 = root->FirstChildElement("book");
//遍历Attribute
for (TiXmlAttribute* pAttr = elem2->FirstAttribute(); pAttr; pAttr = pAttr->Next())
{
string sName = pAttr->Name();
string sValue = pAttr->Value();
}
//获取特定attribute
const char* psz1 = elem2->Attribute("language");//"English"
const char* psz2 = elem2->Attribute("category");//"children",若没有找到"category"属性,则返回NULL
//还有,直接取值的
int i;
elem2->Attribute("name", &i);//返回const char* , 失败返回NULL
double d;
elem2->Attribute("name", &d);
elem2->QueryIntAttribute("name", &i);
elem2->QueryDoubleAttribute("name", &d);
bool b;
elem2->QueryBoolAttribute("name", &b);
//...
//获取CDATA
TiXmlElement* elem3 = root->FirstChildElement("function");
string ss = elem3->GetText();
string ss2 = elem3->FirstChild()->Value();//或者
}
}
catch (std::string& e)
{
return false;
}