.引子: 最近在做GBT28181國標平台對接的工作,涉及到一些進程間消息通訊,消息體有xml格式,之前測試的時候都是拿他們當做字符串去解析,現在正兒八經地開發的時候,就想到了用xml庫去解析,由於之前在HW最後一個項目用到的xml庫就是這個,所以這裡延續使用它。總體來說還是比較好用的: 二.編譯、使用: 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; } } }
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); } 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); }