更新:具有最小的可重现示例
https://github.com/totszwai/libxml2-troubleshoot1
正如我们所看到的,当输入包含一些空格时,libxml2 由于某种原因无法格式化它......
原问题:
我有以下示例 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 中的错误吗?我怎样才能正确地打印/格式化它?任何一个输入都没有错误...
尝试在调用 XML_PARSE_NOBLANKS
时包含
xmlReadDoc()
选项。根据 libxml2 文档:
从结果文档中删除一些仅包含空格的文本节点。删除哪些节点取决于 DTD 元素声明或保守的启发式。 序列化代码的重新缩进功能依赖于解析时设置此选项。