将 xmlDoc 嵌套到现有的 xmlTextWriter 中

Nest xmlDoc into existing xmlTextWriter

我想我遗漏了一些微不足道的东西,但我在这上面浪费了很多时间,所以它的解决方案可能对其他人也有用:

我正在 linux 下使用 libxml2 2.9.8(纯 C,不是 C++ 绑定)。 我有一个表示 XML 文件的外部(非 libxml)树结构,我正在尝试使用 libxml2 写入字符串表示形式。一切都是微不足道的,并且可以很好地遍历它并使用 xmlTextWriter API 编写(它是一个具有简单属性的结构,例如

 typedef struct _simplifiedNode {
    char *tag,
    char *content,
    struct _simplifiedNode *parent,
    struct _simplifiedNodeList *children,
 } simplifiedNode;

),除非在某个时候我遇到了一个字符串节点,它可能包含 xml 文档的字符串表示形式。我可以使用 xmlReadMemory API 解析它,但是我需要将它(而不是它的转义字符串表示)嵌套到正在进行的编写器中,包括名称空间和属性。

我是否缺少一种简单的方法来使用已解析的 doc/root 元素递归执行此操作,而不自省每个子元素?

例如

我正在使用 xmlTextWriter API

生成以下文档
<Title>
    TitleValue
</Title>
<Date>
    2018-11-26
</Date>
<Content>

非 libxml 树中的 Content 节点是一个带有标签 Content 的叶节点,其中包含类似

的字符串
char *content = "<SomeXmlComplexDocument ss:someattr=\"attrval\">Somecontent</SomeXmlComplexDocument>"

我想要实现的是,而不是像

<Content>&lt;SomeXmlComplexDocument&gt; ... </Content>

在使用xmlReadMemory解析并验证内容后重新注入文档获得

<Content>
    <SomeXmlComplexDocument ss:someattr="attrval">Somecontent</SomeXmlComplexDocument>
</Content>

应保留命名空间和属性。

要序列化未转义的内部 XML 片段,您可以简单地使用 xmlTextWriterWriteRaw。不过,这不会检查 XML 是否格式正确。如果您需要验证,则必须在某个时候解析 XML 片段。根据内容模型,您可能必须使用 xmlParseBalancedChunkMemory 而不是 xmlReadMemory。结果文档写完后应该也可以一次性解析,但是会丢失原始行号等信息。