我需要处理一堆非常大的 XML 文件并首先读取每个元素。由于尺寸的原因,任何DOM
解决方案都是毫无疑问的,而且由于实际需要的元素不是“叶子”而是它的父元素,事情变得更加复杂。
更具体地说,这些文件的结构类似于
<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>
元素),则上述内容没有帮助。
一个SAX
解决方案将是理想的,但即使通过XSLT
模板预处理文件也是可以接受的。
有任何想法吗?