我需要处理一堆非常大的XML文件并深度优先读取每个元素。由于尺寸大小,任何解决方案都不存在问题,并且事实由于所需的实际元素不是“叶子”而是其父亲的事实而变得更加复杂。深度首次读取大型XML文件
更具体地,文件具有类似
<Level 1>
...
<Level 2>
...
<Level N-1>
<value>...</value>
<value>...</value>
...
<value>...</value>
</Level N-1>
<Level N-1>
<value>...</value>
<value>...</value>
...
<value>...</value>
</Level N-1>
...
<Level N-1>
<value>...</value>
<value>...</value>
...
<value>...</value>
</Level N-1>
...
</Level 2>
</Level 1>
的结构出像上述的每个文件中,<Level N-1>
元素需要被单独地读取(各自包括所有相应的<value>
元件)。深度N
在每个文件和文件中都有所不同,因此它基本上是未知的,标签名称也是XML
。由于<value>
元素也存在于更高级别(即,它们不能保证已达到Level N
),所以事情变得更加复杂。
在特定深度作为字符串读取整个XML元素一个快速的解决方案是像
int level = 0; // The base level of the element, could be at any depth
Reader in = ... // The reader to the input
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
PrintStream out = new PrintStream(outStream);
XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(in);
XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(out);
XMLEvent event;
while ((level > 0) && reader.hasNext());
{
event = reader.nextEvent();
if (event.isStartElement())
{
level++;
}
else if (event.isEndElement())
{
level--;
}
writer.add(event);
}
writer.flush();
String element = new String(outStream.toByteArray());
以上,但是,是不是有益的,如果调用代码不知道,Level N-1
元件已达到并且它前进到Level N
(即,到<value>
元素)。
A SAX
解决方案将是理想的,但即使通过XSLT
模板预处理文件也是可以接受的。
任何想法?
您是否可以用示例输入和期望输出来澄清要求? –
上面的数据描述中没有太多要添加的内容,只有标签名称会发生变化。基本上,这个想法是将每个Level-1标签上的所有元素组合在一起。 –
PNS