一.引子:
最近在做GBT28181國标平台對接的工作,涉及到一些程序間消息通訊,消息體有xml格式,之前測試的時候都是拿他們當做字元串去解析,現在正兒八經地開發的時候,就想到了用xml庫去解析,由于之前在HW最後一個項目用到的xml庫就是這個,是以這裡延續使用它。總體來說還是比較好用的:
二.編譯、使用:
源碼庫下載下傳:http://sourceforge.net/projects/tinyxml/files/latest/download
Windows下使用方法:1.直接用其VS工程進行編譯生成lib庫,2.拷貝源碼到自己工程中使用。我這裡選擇了第二種,主要是以後想自己看看這塊的源碼,并且程式容易debug。
1. 将tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp拷貝到自己的工程裡
2. 引入頭檔案tinystr.h、tinyxml.h
3.直接編譯使用;
三.介紹:
在TinyXML中,根據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:
void readXml() {
using namespace std;
const char * xmlFile = "conf/school.xml";
TiXmlDocument doc;
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout << "can not parse xml conf/school.xml" << endl;
return;
}
TiXmlElement* rootElement = doc.RootElement(); //School元素
TiXmlElement* classElement = rootElement->FirstChildElement(); // Class元素
TiXmlElement* studentElement = classElement->FirstChildElement(); //Students
for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {
TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //獲得student的name屬性
for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {
cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;
}
TiXmlElement* studentContactElement = studentElement->FirstChildElement();//獲得student的第一個聯系方式
for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {
string contactType = studentContactElement->Value();
string contactValue = studentContactElement->GetText();
cout << contactType << " : " << contactValue << std::endl;
}
}
}
寫xml:
void writeXml() {
using namespace std;
const char * xmlFile = "conf/school-write.xml";
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
TiXmlElement * schoolElement = new TiXmlElement( "School" );
TiXmlElement * classElement = new TiXmlElement( "Class" );
classElement->SetAttribute("name", "C++");
TiXmlElement * stu1Element = new TiXmlElement("Student");
stu1Element->SetAttribute("name", "tinyxml");
stu1Element->SetAttribute("number", "123");
TiXmlElement * stu1EmailElement = new TiXmlElement("email");
stu1EmailElement->LinkEndChild(new TiXmlText("[email protected]") );
TiXmlElement * stu1AddressElement = new TiXmlElement("address");
stu1AddressElement->LinkEndChild(new TiXmlText("合肥"));
stu1Element->LinkEndChild(stu1EmailElement);
stu1Element->LinkEndChild(stu1AddressElement);
TiXmlElement * stu2Element = new TiXmlElement("Student");
stu2Element->SetAttribute("name", "feilong");
stu2Element->SetAttribute("number", "123");
TiXmlElement * stu2EmailElement = new TiXmlElement("email");
stu2EmailElement->LinkEndChild(new TiXmlText("[email protected]"));
TiXmlElement * stu2AddressElement = new TiXmlElement("address");
stu2AddressElement->LinkEndChild(new TiXmlText("中國"));
stu2Element->LinkEndChild(stu2EmailElement);
stu2Element->LinkEndChild(stu2AddressElement);
classElement->LinkEndChild(stu1Element);
classElement->LinkEndChild(stu2Element);
schoolElement->LinkEndChild(classElement);
doc.LinkEndChild(decl);
doc.LinkEndChild(schoolElement);
doc.SaveFile(xmlFile);
}