天天看點

使用libxml2修改節點值

目錄結構:

  将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