我不想在这里留下这个,但我回答了一个类似的问题here。
在 Java 中,您在实际解析 XML 方面有很多选择 - XPath 将是最慢的,但为您提供了一种很好的表达式语言来查询内容。 DOM 将是第二慢的,但会给你一个树模型来记忆你的 doc 行走。 SAX 会更快,但需要您在动态解析文档时构建列表,最后 STAX 将是最快的,但需要您根据格式编写一些特定代码来构建列表。
最后,我会推荐一个我编写的名为 SJXP 的库,它为您提供 STAX 的性能和 XPath 的易用性......它是两者的完美结合。
您编写诸如“/root/Persons/list/Person/Name”之类的规则并将其提供给您的文档,它会在每次遇到名称时触发并为您调用用户提供的回调,将找到的名称交给您.
您为所需的所有值和 viola 创建了一些规则...您可以为“/root/Persons/list/Person”打开标签创建一个 START_TAG 规则,并创建一个新的“Person p = new Person()" 在您的代码中,然后当每个子元素命中时,您只需在人上设置适当的值,如下所示(作为示例):
IRule linkRule = new DefaultRule(Type.CHARACTER, "/root/Persons/list/Person/Name") {
@Override
public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
// Get the last person we added on open-tag.
Person p = personList.get(personList.size() - 1);
// <Name> tag was parsed, 'text' is our parsed Name. Set it.
p.setName(text);
}
}
SJXP 的好处是内存开销低于其他解析器方法并且性能更高(SAX 将解析匹配的元素,基于 STAX 的解析不会将元素解析出流,直到它们请求)。
您最终会编写同样令人困惑的代码,只是为了遍历您的 DOM 和所有 Node 元素来构建您的列表。
最后,如果您对 XML->Object 映射感到满意,您可以照别人说的去做并利用 JAXB。您需要为您的 XML 文件编写一个模式,然后它将为您生成完美映射到它们的 Java 对象。然后,您可以直接将您的 XML 文件映射到您的 Java 对象并调用类似“persons.getList()”或 JAXB 为您生成的任何内容。
在这种情况下(大致)内存开销和性能将与 DOM 解析相当。