2011-06-12 110 views
2

我有一个文件,其中包含几个如下所示的XML文档。Java XML解析

<?xml version="1.0"?><Node>...<Node>...</Node>...</Node><?xml version... 

其中重复几次。

我使用Java,我有一个FileChannel打开文件,我有一个字节缓冲区读取。如果有内置的方式或者更简单的方式或已经解决的方法来用Java对XML字节进行部分解析,将不胜感激。例如像这样:

FooParser parser = new FooParser(); 

while (...) 
{ 
    buffer.flip(); 
    parser.parse(buffer); 
    buffer.compact(); 
    if (parser.done()) 
    { 
     xmlDocs.add(parser.xml()); 
     parser.reset(); 
    } 
    file.read(buffer); 
    ... 
} 

回答

2

没有什么的,我知道的,这将在一个单一的数据流分析多个XML文档的API。我想你将不得不自己扫描<?xml ...标签并分割输入。解析器不会知道它在下一个xml文档被读取到标签之前。此时它会窒息并且下一个xml文档的开始标记已经被读取。

实际上,现在你提到它了,你可能可以使用pull语法分析器来做你想做的事情。但我很确定api中的SAX和DOM解析器不会做你想做的。

+0

解析器应该能够检测到当前XML权限的结束?它为什么要读取超过必需的内容,即超过当前的XML。 – foobarometer 2011-06-12 06:28:06

+0

解析器应该检查文档格式。一条规则是它有一个根标签。解析器将继续读取直到它结束,或者直到遇到第二个根级标记并引发异常。此时,它将读取第二个<?xml'标签。 – 2011-06-12 06:31:56

+0

谢谢特德,我同意你的意见。这会违反良构规则,解析器需要验证。如果有人有任何见解,我会留下一段时间的问题,谢谢! – foobarometer 2011-06-12 06:38:36

0

在XML文件开始时检查<?序列是很常见的,因为XML文件实际上必须以xml声明开始(在文件中间不需要BOM)。所以我会看看编码和拆分文件已经建议在每次发生<?和“xml”之后...

+0

实际上读取整个文件可能不是我的选择。所以我可能会使用文件通道一次编写一个解析器来读取几个字节。谢谢! – foobarometer 2011-06-12 08:50:37

+0

当然,只是为了分割文件,你不需要一次读取整个文件。 – Clemens 2011-06-12 10:12:20

+0

尽管如此,这是一些工作,如果这些都是来自网络的流,将会做什么。不管怎样,谢谢! – foobarometer 2011-06-12 10:25:17

1

我不得不这样做,我已经回答(我)here与阅读器子类包装所有的更简单的使用。