将 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><SomeXmlComplexDocument> ... </Content>
在使用xmlReadMemory
解析并验证内容后重新注入文档获得
<Content>
<SomeXmlComplexDocument ss:someattr="attrval">Somecontent</SomeXmlComplexDocument>
</Content>
应保留命名空间和属性。
要序列化未转义的内部 XML 片段,您可以简单地使用 xmlTextWriterWriteRaw
。不过,这不会检查 XML 是否格式正确。如果您需要验证,则必须在某个时候解析 XML 片段。根据内容模型,您可能必须使用 xmlParseBalancedChunkMemory
而不是 xmlReadMemory
。结果文档写完后应该也可以一次性解析,但是会丢失原始行号等信息。
我想我遗漏了一些微不足道的东西,但我在这上面浪费了很多时间,所以它的解决方案可能对其他人也有用:
我正在 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>
应保留命名空间和属性。
要序列化未转义的内部 XML 片段,您可以简单地使用 xmlTextWriterWriteRaw
。不过,这不会检查 XML 是否格式正确。如果您需要验证,则必须在某个时候解析 XML 片段。根据内容模型,您可能必须使用 xmlParseBalancedChunkMemory
而不是 xmlReadMemory
。结果文档写完后应该也可以一次性解析,但是会丢失原始行号等信息。