gpt4 book ai didi

java - 在java中读取和更新一个大的xml文件

转载 作者:行者123 更新时间:2023-11-30 04:16:49 25 4
gpt4 key购买 nike

我有一个大约 400 MB 的 XML 文件我需要找到一个特定的元素,然后将其日期属性从 mm-dd-yyyy 重新格式化为 dd-mm-yyyy这是我正在使用的代码

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputXML);
doc.getDocumentElement().normalize();
//format the date
NodeList nodes = doc.getElementsByTagName("empDetails");
for (int i = 0; i < nodes.getLength(); i++){
String oldDate =nodes.item(i).getAttributes().getNamedItem("doj").getNodeValue();
String newValue = //formatted to dd-mm-yyyy
nodes.item(i).getAttributes().getNamedItem("doj").setTextContent(newValue);
}

//now write back to file
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer;
transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(fileName));
transformer.transform(source, result);

但是这会导致内存溢出在 Windows 32 位上 - 失败

所以我在 unix 机器上尝试了这个并将内存设置为:java -Xmx3072m -classpath 。我的测试

确实运行了一段时间,但再次失败

问题 - 是否可以处理我想要选择性更新和保存的 400 MB 文件? (我确信答案是肯定的)我的代码有问题吗?我应该更改什么吗? (请不要使用 unix shell 脚本作为替代解决方案 - 我的目的是使用 java )我应该进一步增加堆大小吗?谢谢,萨蒂什

最佳答案

最好使用 StAX api 像流一样读取文档,同时将不想立即更改的部分写出(再次使用 StAX)到临时文件。当您到达感兴趣的部分时,请在将其反馈回临时文件之前更改值。完成后,您可以将临时文件重命名为旧文件。

我推荐 XMLEventReaderXMLEventWriter 。您不关心的 XMLEvents 可以直接从读取器传递到写入器。这只会将您正在处理的文档的一小部分保留在内存中。

XMLEventReader reader = ...;
XMLEventWriter writer = ...;
XMLEvent cursor;

while(reader.hasNext()){
cursor = reader.nextEvent();
if(doICareAboutThisEvent(cursor)){
writer.add(changeEvent(cursor));
}else{
writer.add(cursor);
}

}

显然,实现可能会更复杂,并且您决定要关心和编辑哪些元素可能比单个元素的状态更复杂。这只是一个非常简单的例子。

关于java - 在java中读取和更新一个大的xml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18165464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com