10

既存の xml ファイルを取得し、いくつかの属性を変更してファイルを書き戻す必要があります。

これを行うために libxml2 を使用することを考えていました。アプリケーションは、Linux 上で実行される C/C++ です。

つまり、libxml2 には、同じ配管を介して接続されたポータブル洗面所、シャワー、およびその他のさまざまなものとともに、キッチン シンクのいくつかのバリエーションが含まれているようです。さまざまなパーサーが利用可能で、物事を行うさまざまな方法があります。これまでに libxml2 を使用したことがない人にとって、これは少し怖いものです。

最終的に、出力 .xml が元の入力ファイルと同じであり、加えた変更が加えられるようにするには、どの例を見ればよいでしょうか? これまでのところ、libxml2 の tree1.c、tree2.c、および reader1.c の例で遊んできましたが、これらだけでは、出力 xml はどこにも近くありません。

4

1 に答える 1

21
#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);
于 2008-11-19T23:58:21.680 に答える