目錄結構:
将xml.c 與 user.xml 置于同一目錄下即可
代碼: xml.c
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
typedef struct userMsg
{
char user[20];
char pw[20];
} userMsg_t;
int AppSetUser(char *account, char *parma, char *value)
{
xmlDocPtr pdoc = NULL; //文檔指針
xmlNodePtr proot = NULL, pcur = NULL; //根節點以及目前位置
char filename[] = "user.xml";
//防止程式将元素之前和之後的空白文本符号視為節點
xmlKeepBlanksDefault(0);
pdoc = xmlReadFile(filename, "UTF-8", XML_PARSE_RECOVER); //讀取文檔
if (pdoc == NULL)
{
printf("error:can't open file!\n");
return -1;
}
proot = xmlDocGetRootElement(pdoc);
if (proot == NULL)
{
printf("error:can't read root node!\n");
return -1;
}
pcur = proot->xmlChildrenNode;
while (pcur != NULL)
{
if (!xmlStrcmp(pcur->name, BAD_CAST("user"))) //找到第一個節點
{
xmlNodePtr nptr = pcur->xmlChildrenNode;
while (pcur != NULL)
{
userMsg_t *tmpMsg;
if (!xmlStrcmp(nptr->name, BAD_CAST("account"))) //找到子節點,我是根據需求,需要找到對應的賬号,再設定節點的值
{
char *tempAccount = "";
tempAccount = ((char *)XML_GET_CONTENT(nptr->xmlChildrenNode));
if (strncmp(tempAccount, account, sizeof(tempAccount)) == 0) //判斷賬号是否比對
{
nptr = nptr->next;
//在下面做一個循環,指向account後面的節點,可以根據節點的名稱設定對應的值
while (nptr != NULL)
{
if (!xmlStrcmp(nptr->name, BAD_CAST(parma)))
{
printf("set parma: parma -> %s,value-> %s\n", parma, value);
xmlNodeSetContent(nptr, value);
// xmlSetProp(nptr,parma,value) 這個可以設定節點的屬性值,讀者可以自己去試一下
nptr = nptr->next;
xmlFreeDoc(pdoc);
xmlCleanupParser();
xmlMemoryDump();
return 1;
}
}
break;
}
}
}
pcur = pcur->next;
}
//釋放資源
xmlFreeDoc(pdoc);
xmlCleanupParser();
xmlMemoryDump();
return 1;
}
}
int main()
{
AppSetUser("3001", "password", "5678");
}
xml檔案: user.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<user>
<account>3001</account>
<password>333</password>
</user>
<user>
<account>3002</account>
<password>3002</password>
</user>
</bookstore>
編譯: gcc -o main xml.c -I/usr/include -lxml2 -Wl,-rpath /usr/lib
運作: ./main