XML文件处理——PUGIXML

动态库编译

        一个大型的软件系统,通常有多个地方需要对XML文件进行进行操作,将pugiXML的相关功能编译成一个动态库非常方便。源码和linux系统的makefile在目录XML_demo/pugiXML/pugiXmlLib下。

在linux系统下,cd至该目录下,然后运行

make rebuild

make install

就可以将pugiXML编译成一个动态库libpugixml.so

创建

XML文件的创建代码如下

int generateXML(const char* xmlName)

{

       // XML文件声明

       pugi::xml_document demoXML;

       pugi::xml_node decl = demoXML.prepend_child(pugi::node_declaration);

       decl.append_attribute("version") = "1.0";

       decl.append_attribute("encoding") = "UTF-8";

       decl.append_attribute("standalone") = "yes";

       pugi::xml_node nodeRoot = demoXML.append_child("Root");

       pugi::xml_node nodeBookNum = nodeRoot.append_child("BookNum");

       nodeBookNum.append_child(pugi::node_pcdata).set_value("2");

       pugi::xml_node nodeBooks = nodeRoot.append_child("Books");

       nodeBooks.append_attribute("name") = "myBookList";

       pugi::xml_node nodebook1 = nodeBooks.append_child("book");

       pugi::xml_node nodename1 = nodebook1.append_child("name");

       nodename1.append_child(pugi::node_pcdata).set_value("Signal Processing");

       pugi::xml_node nodepublisher1 = nodebook1.append_child("publisher");

       nodepublisher1.append_child(pugi::node_pcdata).set_value("Education");

       pugi::xml_node nodebook2 = nodeBooks.append_child("book");

       pugi::xml_node nodename2 = nodebook2.append_child("name");

       nodename2.append_child(pugi::node_pcdata).set_value("SAR");

       pugi::xml_node nodepublisher2 = nodebook2.append_child("publisher");

       nodepublisher2.append_child(pugi::node_pcdata).set_value("Education");

       demoXML.save_file(xmlName);

       return 0;

}

运行上述函数后,生成的XML文件如下所示:

      2

     

            

                    Signal Processing

                    Education

            

            

                    SAR

                    Education

            

     

读取

使用下面的函数,读取上一节生成的XML文件:

int readXML(const char* xmlName)

{

       pugi::xml_document doc;

       pugi::xml_parse_result result = doc.load_file(xmlName);

       if (result.status == 0)

       {

              // cout << "加载成功 " << endl;

       }

       else

       {

              cout << " 加载xml失败 " << xmlName << endl;

              return -1;

       }

       pugi::xml_node nodeRoot = doc.child("Root");

       if (nodeRoot)

       {

              string bookNum = nodeRoot.child("BookNum").first_child().value();

              printf("BookNum: %d\n", atoi(bookNum.c_str()));

              pugi::xml_node nodeBooks = nodeRoot.child("Books");

        for (pugi::xml_node nodebook = nodeBooks.child("book"); nodebook; nodebook = nodebook.next_sibling("book"))

        {

            pugi::xml_node nodename = nodebook.child("name");

            printf("name : %s\n",nodename.first_child().value());

            pugi::xml_node nodepublisher = nodebook.child("publisher");

            printf("publisher: %s\n",nodepublisher.first_child().value());

        }

       }

       else

       {

              cout << "ERROR!!!根节点不是Root,xml文件格式错误 \n" << endl;

              return -1;

       }

      

       return 0;

}

修改

XML文件的修改包括增加、删除、修改node的内容,详细函数如下所示。

int modifyXML(const char* xmlName)

{

       pugi::xml_document doc;

       pugi::xml_parse_result result = doc.load_file(xmlName);

       if (result.status == 0)

       {

              // cout << "加载成功 " << endl;

       }

       else

       {

              cout << " 加载xml失败 " << xmlName << endl;

              return -1;

       }

       pugi::xml_node nodeRoot = doc.child("Root");

       if (nodeRoot)

       {

              string bookNum = nodeRoot.child("BookNum").first_child().value();

              printf("BookNum: %d\n", atoi(bookNum.c_str()));

              pugi::xml_node nodeBooks = nodeRoot.child("Books");

        for (pugi::xml_node nodebook = nodeBooks.child("book"); nodebook; nodebook = nodebook.next_sibling("book"))

        {

             pugi::xml_node nodename = nodebook.child("name");

            printf("name : %s\n",nodename.first_child().value());

            nodename.text().set("hhh");  // 修改

            pugi::xml_node nodepublisher = nodebook.child("publisher");

            printf("publisher: %s\n",nodepublisher.first_child().value());

            nodebook.remove_child("publisher");             // 删除

            pugi::xml_node isdn = nodebook.append_child("isdn");

                     isdn.append_child(pugi::node_pcdata).set_value("123-456-789"); // 增加

             pugi::xml_node pagenode = nodebook.insert_child_before("page", nodename);

             pagenode.append_child(pugi::node_pcdata).set_value("1234"); // 增加

             pugi::xml_node ownnode = nodebook.insert_child_after("owner", isdn);

             ownnode.append_child(pugi::node_pcdata).set_value("Tom");  // 增加

        }

       }

       else

       {

              cout << "ERROR!!!根节点不是Root,xml文件格式错误 \n" << endl;

              return -1;

       }

      

       doc.print(std::cout); 

       doc.save_file(xmlName);

       return 0;

}



    2
    
        
            1234
            hhh
            123-456-789
            Tom
        

        
            1234
            hhh
            123-456-789
            Tom
        

    

 注,下面的链接是tinyxml的使用样例:CSDNhttps://mp.csdn.net/mp_download/manage/download/UpDetailed

你可能感兴趣的:(xml)