代码之家  ›  专栏  ›  技术社区  ›  Stéphane

如何使用libxml2修改现有的xml文件?

  •  10
  • Stéphane  · 技术社区  · 17 年前

    我需要取一个现有的xml文件,只修改几个属性,然后将文件写回。

    我在考虑使用libxml2来完成这项工作。应用程序是在Linux上运行的C/C++。

    问题是,libxml2似乎包括厨房水槽的几种变体,以及便携式卫生间、淋浴间和通过同一管道连接的各种其他东西。有不同的解析器可用,也有不同的做事方式。对于以前没有使用过libxml2的人来说,这有点吓人。

    我应该查看哪个示例,以便最终我的output.xml与原始输入文件以及我所做的更改完全相同?到目前为止,我一直在使用libxml2的tree1.c、tree2.c和reader1.c示例,但仅使用这些示例,输出xml就不会接近相同。

    1 回复  |  直到 17 年前
        1
  •  21
  •   Brian R. Bondy    17 年前
    #include <libxml/xmlmemory.h>
    #include <libxml/parser.h>
    #include <libxml/xpath.h>
    
    //Load in the xml file from disk
    xmlDocPtr pDoc = xmlParseFile("file.xml");
    //Or from a string xmlDocPtr pDoc = xmlNewDoc("<root><element/></root>");
    
    //Do something with the document
    //....
    
    //Save the document back out to disk.
    xmlSaveFileEnc("file.xml", pDoc, "UTF-8");
    

    你想要的主要东西可能是这些功能:

    xmlNodePtr pNode = xmlNewNode(0, (xmlChar*)"newNodeName");
    xmlNodeSetContent(pNode, (xmlChar*)"content");
    xmlAddChild(pParentNode, pNode);
    xmlDocSetRootElement(pDoc, pParentNode);
    

    下面是一个使用xpath进行选择的快速示例:

    //Select all the user nodes
    xmlChar *pExpression((xmlChar*)_T("/users/user"));
    xmlXPathObjectPtr pResultingXPathObject(getnodeset(pDoc, pExpression));
    if (pResultingXPathObject)
    {
        xmlNodeSetPtr pNodeSet(pResultingXPathObject->nodesetval);
        for(int i = 0; i < pNodeSet->nodeNr; ++i) 
        {
            xmlNodePtr pUserNode(pNodeSet->nodeTab[i]);
                       //do something with the node
        }
    }
    xmlXPathFreeObject(pResultingXPathObject);
    
    推荐文章