在使用 libxml2 库解析 XML 文档时,可以通过设置 xmlSaveOption 来保留文档中标签的闭合方式。具体的步骤如下:

  1. 使用 xmlReadFile 函数读取 XML 文档并解析成 DOM 树结构。

  2. 创建一个 xmlOutputBuffer 对象,用于将解析后的 XML 文档内容输出到屏幕上。

  3. 使用 xmlSaveToBuffer 函数将 DOM 树输出到 xmlOutputBuffer 对象中,同时设置 xmlSaveOptionXML_SAVE_NO_EMPTY,表示保留文档中标签的闭合方式。

  4. 使用 xmlOutputBufferFlush 函数将 xmlOutputBuffer 对象中的内容输出到屏幕上。

下面是示例代码:

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/xmlsave.h>

int main(int argc, char **argv) {
    xmlDocPtr doc;
    xmlOutputBufferPtr buf;
    xmlSaveCtxtPtr savectx;
    int bufsize;
    char *buffer;

    // 读取xml文档并解析成DOM树结构
    doc = xmlReadFile('example.xml', NULL, 0);
    if (doc == NULL) {
        fprintf(stderr, 'Failed to parse document\n');
        return 1;
    }

    // 创建xmlOutputBuffer对象
    bufsize = 4096;
    buffer = malloc(bufsize);
    buf = xmlOutputBufferCreateBuffer(buffer, bufsize, NULL);
    if (buf == NULL) {
        fprintf(stderr, 'Failed to create output buffer\n');
        return 1;
    }

    // 创建xmlSaveCtxt对象,并设置xmlSaveOption为XML_SAVE_NO_EMPTY
    savectx = xmlSaveToBuffer(buf, 'UTF-8', XML_SAVE_NO_EMPTY);
    if (savectx == NULL) {
        fprintf(stderr, 'Failed to create save context\n');
        return 1;
    }

    // 将DOM树输出到xmlOutputBuffer对象中
    xmlSaveDoc(savectx, doc);
    xmlSaveClose(savectx);

    // 输出xmlOutputBuffer对象中的内容到屏幕上
    xmlOutputBufferFlush(buf);
    printf('%s', buffer);

    // 释放资源
    xmlFreeDoc(doc);
    xmlOutputBufferClose(buf);
    free(buffer);

    return 0;
}

假设 example.xml 文件内容如下:

<root>
    <SpecificInformation/>
    <SpecMod></SpecMod>
</root>

执行以上代码后,会在屏幕上输出以下内容:

<?xml version='1.0' encoding='UTF-8'?>
<root>
    <SpecificInformation/>
    <SpecMod></SpecMod>
</root>
Libxml2 保留 XML 文档标签闭合方式 - Windows 平台示例

原文地址: https://www.cveoy.top/t/topic/n3qc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录