我想我错过了一些琐碎的事情,但是我为此浪费了很多时间,因此它的解决方案也可能对其他人有用:
我正在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><SomeXmlComplexDocument> ... </Content>
在用xmlReadMemory
解析并验证了内容之后,重新注入了获取的文档
<Content>
<SomeXmlComplexDocument ss:someattr="attrval">Somecontent</SomeXmlComplexDocument>
</Content>
名称空间和属性应保留。
答案 0 :(得分:0)
要序列化未转义的内部XML片段,只需使用xmlTextWriterWriteRaw
。但是,这不会检查XML格式是否正确。如果需要验证,则必须在某个时候解析XML片段。根据内容模型的不同,您可能必须使用xmlParseBalancedChunkMemory
而不是xmlReadMemory
。写完结果文档后,还应该可以一次性解析它,但是您会丢失诸如原始行号之类的信息。