【发布时间】:2020-02-10 08:46:19
【问题描述】:
我有一个这样的无模式 XML 文档流:
<?xml version="1.0" encoding="UTF-8"?>
<message id="1">
<text>aaaaaaa</text>
</message>
<kuku>
bbbbb
</kuku>
<?xml version="1.0" encoding="UTF-8"?>
<other_message id="3">
<text>ccccc</text>
</other_message>
需要解析文档的是流模式。
通过单个根 XML 元素包装流的解决方案不起作用,因为当 StAX 在文档中遇到 <?xml ... ?> 元素时会失败。但如果我能够在输入流中跳过此元素,则可以使用它。
所有文档都可以不同,所以没有共同的end_document XML 元素。
【问题讨论】:
-
您认为“XML 文档”到底是什么?在 XML 规范定义的意义上,您需要一个包含所有其他元素的根元素。即使您的第一个片段在顶层具有
message和kuku,情况似乎也并非如此。 -
您想使用 SAX 或 StAX 吗?它们本质上是不同的模型;您的问题被标记为两者。
-
是否确保任何 XML 声明 (
<?xml version="1.0" ...?>) 都在自己的一行上? XQuery 3 或 XSLT 3 在 XSLT 中使用unparsed-text-lines和xsl:for-each-group group-starting-with或在 XQuery 中使用翻滚窗口来识别片段,然后在每个组上使用parse-xml-fragmentstring-join()ed 至少应该允许像这样拆分输入。 -
@Ironluca 在遇到第二个根元素或XML解析指令时都失败
<?...?> -
@PavelLeonov,正如您所观察到的,您要么将声明从流中过滤掉,要么遵循 Kay 博士建议的一些变体。不会有其他机制。