如果 xml 包含空格,libxml2 打印不漂亮?

问题描述 投票:0回答:1

更新:具有最小的可重现示例

https://github.com/totszwai/libxml2-troubleshoot1

正如我们所看到的,当输入包含一些空格时,libxml2 由于某种原因无法格式化它......

enter image description here

原问题:

我有以下示例 xml,如果我将其提供给

libxml2
且中间没有任何格式或空格,那么当使用
xmlNodeDump
调用
1
时,它会打印得很好:

const char *xml= "<root><a>test</a></root>";

但是,如果我预先格式化它或中间有空格,那么

libxml2
将拒绝漂亮地打印它,例如:

const char *xml =
"<root>"
"  <a>"
"    test"
"  </a>"
"</root>";

然后我调用函数来读取它们,如下所示:

#define MY_PARSER_OPTIONS (XML_PARSE_RECOVER | XML_PARSE_NOENT | XML_PARSE_DTDLOAD | XML_PARSE_DTDATTR | XML_PARSE_HUGE)
...

    doc = xmlReadDoc((const xmlChar *) xml, NULL, NULL, MY_PARSER_OPTIONS);
...
    xmlNodePtr root = xmlDocGetRootElement(doc);
    xmlBufferPtr buf = xmlBufferCreate();
    xmlNodeDump(buf, doc, root, 0, 1);

输出将不会被格式化...

当输入包含空格时,输出为:

<root>  <a>    test  </a></root>

当输入不包含空格时,

xmlNodeDump
输出为:

<root>
  <a>test</a>
</root>

这是 libxml2 中的错误吗?我怎样才能正确地打印/格式化它?任何一个输入都没有错误...

c++ xml-parsing libxml2 xml-formatting
1个回答
0
投票

尝试在调用 XML_PARSE_NOBLANKS

 时包含 
xmlReadDoc()
 选项。根据 libxml2 文档:

从结果文档中删除一些仅包含空格的文本节点。删除哪些节点取决于 DTD 元素声明或保守的启发式。 序列化代码的重新缩进功能依赖于解析时设置此选项。

© www.soinside.com 2019 - 2024. All rights reserved.