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

标签 c xml linux libxml2

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

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

事实是,libxml2 似乎包括厨房水槽的多种变体,以及可移植洗手间、淋浴间和通过相同管道连接的其他各种东西。有不同的解析器可用,以及不同的处理方式。对于以前没有使用过 libxml2 的人来说,这有点吓人。

我应该查看什么示例,以便最终我的输出 .xml 与原始输入文件以及我所做的更改相同?到目前为止,我一直在玩 libxml2 的 tree1.c、tree2.c 和 reader1.c 示例,但只有这些,输出的 xml 不会有任何相似之处。

最佳答案

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

关于c - 如何使用 libxml2 修改现有的 xml 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/303845/

相关文章:

c - 在 Linux 上检测 VMM

javascript - Symfony Ajax 请求错误 500

java - 将布局 XML 的内容插入特定于 ID 的 View

c# - 需要帮助序列化多个对象以使用 C# 缓存到 redis

子shell进程双向重定向到父进程

python - 使用 Psycopg2 保持 Python 和 Postgresql 之间持续连接的最佳/最佳实践

c - 我们如何检查输入字符串是否是有效的 double 字符串?

c - 如何让 C 程序接受一次选项

c - 优化重写以下C代码

linux - 在 PT_GNU_STACK 程序头上设置执行位时,为什么进程的所有段都变为可执行