XML read and write operations in C++ (generate XML & parse XML)

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;
    }

Guess you like

Origin blog.csdn.net/m0_73344394/article/details/130275307