您现在要看的类是通过Java中的XPath解析XML文档的经典方法:
public class Main {
private Document createXMLDocument(String fileName) throws Exception {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(fileName);
return doc;
}
private NodeList readXMLNodes(Document doc, String xpathExpression) throws Exception {
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(xpathExpression);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
return nodes;
}
public static void main(String[] args) throws Exception {
Main m = new Main();
Document doc = m.createXMLDocument("tv.xml");
NodeList nodes = m.readXMLNodes(doc, "//serie/eason/@id");
int n = nodes.getLength();
Map<Integer, List<String>> series = new HashMap<Integer, List<String>>();
for (int i = 1; i <= n; i++) {
nodes = m.readXMLNodes(doc, "//serie/eason[@id='" + i + "']/episode/text()");
List<String> episodes = new ArrayList<String>();
for (int j = 0; j < nodes.getLength(); j++) {
episodes.add(nodes.item(j).getNodeValue());
}
series.put(i, episodes);
}
for (Map.Entry<Integer, List<String>> entry : series.entrySet()) {
System.out.println("Season: " + entry.getKey());
for (String ep : entry.getValue()) {
System.out.println("Episodio: " + ep);
}
System.out.println("+------------------------------------+");
}
}
}
在那里我发现一些方法在巨大的xml文件的情况下令人担忧。喜欢使用
Document doc = builder.parse(fileName);
return doc;
或
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
return nodes;
我很担心,因为我需要处理的xml文档是由客户创建的,在内部你基本上可以有无限数量的记录来描述电子邮件及其内容(每个用户都有自己的个人电子邮件,所以很多html in那里)。我知道这不是最聪明的方法,但它是其中一种可能性,在我到达这里之前它已经启动并运行。
我的问题是:我如何使用xpath parse
和evaluate
巨大的xml文件?
答案 0 :(得分:3)
您可以使用StAX解析器。它将占用比DOM选项更少的内存。 StAX的一个很好的介绍在http://tutorials.jenkov.com/java-xml/stax.html
答案 1 :(得分:2)
首先,XPath不解析XML。您的createXMLDocument()方法执行此操作,生成解析的XML的树表示形式的输出。然后使用XPath搜索树表示。
你真正想要的是在解析XML时动态搜索XML。
实现此目的的一种方法是使用实现“文档投影”的XQuery系统(例如,Saxon-EE)。这将分析您的查询以查看文档的哪些部分,并且在解析文档时,它将构建一个仅包含实际需要的文档部分的树。
但是,如果查询与示例中的查询一样简单,那么将其编码为SAX应用程序并不难,其中诸如startElement和endElement之类的事件由XML解析器通知应用程序,没有在内存中构建树。