This question already has answers here:
Efficient Parser for large XMLs
(4个答案)
5年前关闭。
用Java查询大型XML文件的最快方法是什么,
DOM-xpath:这需要很多时间,
在代码的最后一行,程序将在40秒内完成,而在1秒内没有它。
SAX:我不知道是否可以将其用于查询,但是在Internet上我只能找到解析示例。
还有什么其他选项可以使查询更快,我的xml文件的大小约为5MB。 n
XML输入(input.xml)
演示
您将需要在
(4个答案)
5年前关闭。
用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:我不知道是否可以将其用于查询,但是在Internet上我只能找到解析示例。
还有什么其他选项可以使查询更快,我的xml文件的大小约为5MB。 n
最佳答案
如果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);
}
}
关于java - 在Java中查询xml的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17250259/