在java中查询巨大的XML文件的最快方法是什么,
DOM - xpath:这需要很多时间,
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("test.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();
String xPath = "/*/*[@id='ABCD']/*/*";
XPathExpression expr = xpath.compile(xPath);
//this line takes lot of time
NodeList result = (NodeList)expr.evaluate(document, XPathConstants.NODESET);
代码中的最后一行,程序在40秒内完成,在1秒内完成。
SAX:我不知道这是否可以用于查询,在互联网上我只能找到解析的例子。
使查询更快的其他选项有哪些,我的xml文件大小约为5MB。日Thnx
答案 0 :(得分:3)
如果您的id
属性属于xs:ID
类型且您的文档具有XML架构,则可以使用Document.getElementById(String)
方法。我将在下面举例说明。
XML架构
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/schema"
xmlns:tns="http://www.example.org/schema"
elementFormDefault="qualified">
<element name="foo">
<complexType>
<sequence>
<element ref="tns:bar" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<element name="bar">
<complexType>
<attribute name="id" type="ID"/>
</complexType>
</element>
</schema>
XML输入(input.xml)
<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns="http://www.example.org/schema">
<bar id="ABCD"/>
<bar id="EFGH"/>
<bar id="IJK"/>
</foo>
<强>演示强>
您需要在Schema
上设置DocumentBuilderFactory
的实例才能让一切正常运作。
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import org.w3c.dom.*;
public class Demo {
public static void main(String[] args) throws Exception {
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("src/forum17250259/schema.xsd"));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setSchema(schema);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("src/forum17250259/input.xml"));
Element result = document.getElementById("EFGH");
System.out.println(result);
}
}
答案 1 :(得分:1)
查看SAX api,因为它是目前可用于处理XML文档的最快且内存最少的机制
答案 2 :(得分:1)
这取决于您要执行的查询类型。
例如,如果你只是想通过ID找到一个节点,然后读出它的文本内容,那么SAX将会非常快,但它需要一些编码来编写一个SAX处理程序(可能从{{3}扩展) })。
另一方面,如果你想要执行一个相当复杂的查询,那就是“获取foo的第三个祖先节点,其中foo有一个孩子bah”,你几乎必须使用xpath作为SAX处理程序非常复杂。
答案 3 :(得分:1)
Jdk的默认XPath引擎因其性能缓慢而臭名昭着。你应该考虑Jaxen或vtd-xml。请参阅以下rticles ....
http://fahdshariff.blogspot.com/2010/08/faster-xpaths-with-vtd-xml.html
答案 4 :(得分:-2)
尝试一下Jackson lib,它是最快的xml / json p之一