2008-11-19 10 views
10

Tôi cần lấy một tệp xml hiện có và sửa đổi chỉ một vài thuộc tính và ghi lại tệp.cách sử dụng libxml2 để sửa đổi tệp xml hiện có?

Tôi đã nghĩ đến việc sử dụng libxml2 để thực hiện việc này. Ứng dụng là C/C++ chạy trên Linux.

Thing là, libxml2 dường như bao gồm một số biến thể của bồn rửa nhà bếp, cùng với nhà vệ sinh di động, vòi sen và nhiều thứ khác được kết nối thông qua hệ thống ống nước tương tự. Có sẵn các trình phân tích cú pháp khác nhau và các cách làm khác nhau. Đối với người chưa sử dụng libxml2 trước đây, điều này hơi đáng sợ.

Tôi nên xem ví dụ nào, để cuối cùng, đầu ra của tôi .xml giống với tệp đầu vào gốc, cộng với những thay đổi tôi đã thực hiện? Cho đến nay, tôi đã chơi với các ví dụ tree1.c, tree2.c, và reader1.c của libxml2, nhưng chỉ với những kết quả xml đầu ra này không có ở bất kỳ đâu.

+2

Ngoài trả lời lớn Brian Bondy 's , Tôi đã viết một bài viết nhỏ về "Làm thế nào để bắt đầu" với libxml2: http://charette.no-ip.com:81/programming/2010-01-03_LibXml2/ –

Trả lời

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"); 

Những điều chính mà bạn muốn có lẽ là những chức năng:

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

Và đây là một ví dụ nhanh của việc sử dụng xpath để chọn điều:

//Select all the user nodes 
xmlChar *pExpression((xmlChar*)_T("https://stackoverflow.com/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); 
+0

Tôi ước gì tôi đã thấy điều này sớm hơn ! – Yos

+0

Tại sao bạn sử dụng 'Loại Var (Giá trị)' thay vì 'Loại Var = Giá trị'? –