我正在尝试使用 JAVA 中的 SAX 读取基于 xml 并称为 mzXML 的文件格式。它携带部分编码的质谱数据(具有强度的信号)。
这是感兴趣的条目的样子(有更多信息):
<peaks ... >eJwBgAN//EByACzkZJkHP/NlAceAXLJAckeQ4CIUJz/203q2...</peaks>
可以在此处下载在我的情况下强制错误的完整文件。
其中一个条目中的字符串包含大约 500 个压缩和 base64 编码的双精度对(信号和强度)。我所做的是解压缩和解码,以获取值(下面的示例中未显示解码)。这在一个小数据集上一切正常。现在我用了一个更大的,我遇到了一个我不明白的问题:
过程characters(ch,start,length)不会读取前面显示的行中的完整条目。长度值似乎很小。
当我刚刚将峰条目打印到控制台时,我没有看到这个问题,因为有很多字母,我不知道字母丢失了。但是解压失败,当有信息丢失时。当我反复运行这个程序时,它总是在同一点断开同一行而没有给出任何异常。如果我通过例如删除扫描来更改 mzXML 文件,它会在不同的位置中断。我在 character() 过程中使用断点查看currentValue的内容发现了这一点
这是概括问题所必需的一段代码:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
import javax.xml.bind.DatatypeConverter;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReadXMLFile {
public static byte[] decompress(byte[] data) throws IOException, DataFormatException {
Inflater inflater = new Inflater();
inflater.setInput(data);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
byte[] buffer = new byte[data.length*2];
while (!inflater.finished()) {
int count = inflater.inflate(buffer);
outputStream.write(buffer, 0, count);
}
outputStream.close();
byte[] output = outputStream.toByteArray();
return output;
}
public static void main(String args[]) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean peaks = false;
public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("PEAKS")) {
peaks = true;
}
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
if (peaks) {peaks = false;}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (peaks) {
String currentValue = new String(ch, start, length);
System.out.println(currentValue);
try {
byte[] array = decompress(DatatypeConverter.parseBase64Binary(currentValue));
System.out.println(array[1]);
} catch (IOException | DataFormatException e) {e.printStackTrace();}
peaks = false;
}
}
};
saxParser.parse("file1_zlib.mzxml", handler);
} catch (Exception e) {e.printStackTrace();}
}
}
有没有更安全的方法来读取大型 xml 文件?你能告诉我错误来自哪里或如何避免它吗?
谢谢,迈克尔