使用libxml2时xmlReadMemory未保留空节点原始格式,如何处理?
保留libxml2解析XML时空节点的原始形式
这个问题我之前也碰到过,确实可以通过调整xmlReadMemory()的解析选项来解决!
libxml2默认会把空元素(<tag></tag>)折叠成自闭合标签(<tag/>),但你可以通过启用XML_PARSE_NOEMPTY选项来改变这个行为。这个选项会告诉解析器保留空元素的原始开始+结束标签结构,而不进行折叠。
具体实现步骤
- 在调用
xmlReadMemory()时,将最后一个options参数设置为XML_PARSE_NOEMPTY:
const char* xml_str = "<root><tag></tag><another>content</another></root>"; xmlDocPtr doc = xmlReadMemory(xml_str, strlen(xml_str), NULL, NULL, XML_PARSE_NOEMPTY);
- 验证效果:当你后续将解析后的
xmlDocPtr输出为XML字符串时,空节点会保持<tag></tag>的原始形式,而不会被转换成<tag/>。
注意事项
- 确保你的libxml2版本支持
XML_PARSE_NOEMPTY选项,该选项从libxml2 2.7.0版本开始引入,主流版本都已支持。 - 输出XML时,避免设置会强制折叠空元素的输出选项(比如
XML_SAVE_NO_EMPTY,不过默认输出行为不会这么做),这样就能保证空节点的格式和解析时一致。
内容的提问来源于stack exchange,提问作者viv
相关产品推荐
相关产品推荐

