我正在研究一个java项目来优化现有代码。目前我正在使用BufferedReader / FileInputStream在Java中将XML文件的内容读取为String。
但我的问题是,是否有更快的方式来读取XML内容。SAX / DOM比BufferedReader / FileInputStream快吗?
需要有关上述问题的帮助。
提前致谢。
答案 0 :(得分:5)
我认为在其他问题中显示的代码比类似DOM的解析器更快,这肯定需要更多内存并且可能需要一些计算才能完全重建文档。您可能希望对代码进行概要分析。
如果您使用javax XMLStreamReader
,我也认为您的代码可以为流处理做一些调整,我发现这对许多任务非常有帮助。该类" ...旨在成为读取XML数据的最低级别和最有效的方式",according to Oracle 。
以下是我的代码摘录,其中我解析了作为公共数据转储分发的StackOverflow用户XML文件:
// the input file location
private static final String fileLocation = "/media/My Book/Stack/users.xml";
// the target elements
private static final String USERS_ELEMENT = "users";
private static final String ROW_ELEMENT = "row";
// get the XML file handler
//
FileInputStream fileInputStream = new FileInputStream(fileLocation);
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(
fileInputStream);
// reading the data
//
while (xmlStreamReader.hasNext()) {
int eventCode = xmlStreamReader.next();
// this triggers _users records_ logic
//
if ((XMLStreamConstants.START_ELEMENT == eventCode)
&& xmlStreamReader.getLocalName().equalsIgnoreCase(USERS_ELEMENT)) {
// read and parse the user data rows
//
while (xmlStreamReader.hasNext()) {
eventCode = xmlStreamReader.next();
// this breaks _users record_ reading logic
//
if ((XMLStreamConstants.END_ELEMENT == eventCode)
&& xmlStreamReader.getLocalName().equalsIgnoreCase(USERS_ELEMENT)) {
break;
}
else {
if ((XMLStreamConstants.START_ELEMENT == eventCode)
&& xmlStreamReader.getLocalName().equalsIgnoreCase(ROW_ELEMENT)) {
// extract the user data
//
User user = new User();
int attributesCount = xmlStreamReader.getAttributeCount();
for (int i = 0; i < attributesCount; i++) {
user.setAttribute(xmlStreamReader.getAttributeLocalName(i),
xmlStreamReader.getAttributeValue(i));
}
// all other user record-related logic
//
}
}
}
}
}
用户文件格式非常简单,类似于Bank.xml
文件:
<users>
<row Id="1567200" Reputation="1" CreationDate="2012-07-31T23:57:57.770" DisplayName="XXX" EmailHash="XXX" LastAccessDate="2012-08-01T00:55:12.953" Views="0" UpVotes="0" DownVotes="0" />
...
</users>
答案 1 :(得分:0)
有不同的解析器选项。
考虑使用流式解析器,因为DOM可能变得非常大。即推送或拉取解析器。
并不是说XML解析器必然很慢。考虑您的网络浏览器。它一直进行XML解析,并且很难对语法错误进行强大的修改。通常,记忆是一个更大的问题。