我正在尝试解析和替换一个大约45MB大小的XML文件中的值。我的做法是:
private void replaceData(File xmlFile, File out)
{
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder db = df.newDocumentBuilder();
Document xmlDoc = db.parse(xmlFile);
xmlDoc.getDocumentElement().normalize();
Node allData = xmlDoc.getElementsByTagName("Data").item(0);
Element ctrlData = getSubElement(allData, "ctrlData");
NodeList subData = ctrlData.getElementsByTagName("SubData");
int len = subData.getLength();
for (int logIndex = 0; logIndex < len; logIndex++) {
Node log = subData.item(logIndex);
Element info = getSubElement(log, "info");
Element value = getSubElement(info, "dailyInfo");
Node valueNode = value.getElementsByTagName("value").item(0);
valueNode.setTextContent("blah");
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
DOMSource s = new DOMSource(xmlDoc);
StreamResult r = new StreamResult(out);
t.transform(s, r);
} catch (TransformerException | ParserConfigurationException | SAXException | IOException e) {
throw e;
}
}
private static Element getSubElement(Node node, String elementName)
{
return (Element)((Element)node).getElementsByTagName(elementName).item(0);
}
我注意到随着for循环的进行,所需时间越长。对于平均100k节点的情况,需要超过2小时的时间,而如果手动分解为1k的较小块,则只需要约10秒钟。这个文档被解析的方式是否存在效率问题?
----编辑----
根据评论和答案,我转而使用Sax和XmlStreamWriter。参考/示例在此处:http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/ 转向使用SAX后,replaceData函数的内存使用不会扩展到XML文件的大小,并且XML文件处理时间平均为18秒。
dimensionValue
是从哪里来的?它去了哪里?dimension
也是同样的情况。 - Bob DalgleishDocument xmlDoc = db.parse(xmlFile);
- Ralf