将xmlDoc嵌套到现有的xmlTextWriter中

时间:2018-11-26 09:48:10

标签: c nested libxml2 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>

名称空间和属性应保留。

1 个答案:

答案 0 :(得分:0)

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