gpt4 book ai didi

java - 如何通过 VTD-XML 中的节点名称-值合并(加入)两个不同的 xml 文件?

转载 作者:行者123 更新时间:2023-11-30 11:41:14 24 4
gpt4 key购买 nike

我是 Java 的新手,在评估了一些 Java 库之后,我通过其性能测试和使用 Xpath 的选项选择了 VTD-XML,我尝试了 StaX,我认为它不适合人类,真的很难理解如何解析有效(几乎对我 XD)。

因此,我的目标是将来自 partial_geo_codes.xml 的 geo_code 节点“注入(inject)”到 geo_code accommodations.xml 中,匹配来自两者的节点 ext_id 上的值

住宿.xml

<accommodations>
<accommodation>
<ext_id>12345</ext_id>
<type>A</type>
<details>D</details>
<geo_code />
</accommodation>

这是要附加到 accommodation.xml 中的文件:

partial_geo_codes.xml

<geo_codes>
<geo_code>
<ext_id>12345</ext_id>
<geo_idlocacion>77500</geo_idlocacion>
<latitude>42.578114</latitude>
<longitude>1.648293</longitude>
</geo_code>
<geo_code>
...
<geo_code>
<geo_code>
...
<geo_code>
<geo_codes>

这是预期的输出:

accommodation_new.xml

<accommodations>
<accommodation>
<ext_id>12345</ext_id>
<type>A</type>
<details>D</details>
<geo_code>
<ext_id>12345</ext_id>
<geo_idlocacion>77500</geo_idlocacion>
<latitude>42.578114</latitude>
<longitude>1.648293</longitude>
<geo_code>
</accommodation>
<accommodation>
.....
</accommodation>
......
</accommodations>

这是我的“想要成为真正糟糕的”Java 类:

import com.ximpleware.extended.*;
import java.io.*;

public class MergeVtd {

public static void main(String args[]) throws Exception {

String filesPath = new java.io.File("").getAbsolutePath() .concat("/main/src/");
long start = System.currentTimeMillis();


//init original xml
VTDGenHuge vgh = new VTDGenHuge();
//init tobemerged xml
VTDGenHuge vgm = new VTDGenHuge();


if (vgm.parseFile(filesPath.concat("partial_geo_code.xml"),true,VTDGenHuge.MEM_MAPPED)){

VTDNavHuge vnm = vgm.getNav();
AutoPilotHuge apm = new AutoPilotHuge(vnm);
apm.selectElement("ext_id");


int count=0;
while (apm.iterate()){
int t = vnm.getText();
if (t!=-1) {
System.out.println("Value vnm ==> "+vnm.toNormalizedString(t));

//we have id to match....

if (vgh.parseFile(filesPath.concat("accommodation.xml"),true,VTDGenHuge.MEM_MAPPED)){
VTDNavHuge vnh = vgh.getNav();
AutoPilotHuge aph = new AutoPilotHuge(vnh);
aph.selectXPath("/accommodations/accommodation/ext_id[text()='" + vnm.toNormalizedString(t) + "']" );


int result = -1;
while ((result=aph.evalXPath())!=-1){
int g = vnh.getText();
if (g!=-1) {
System.out.println("Value vnh ==> "+vnh.toNormalizedString(g));

} else {
System.out.println("no match in vnh !======= ");
}
}
}

}

System.out.println("============================== " + count);
count++;

}

}

long end = System.currentTimeMillis();
System.out.println("Execution time was "+ (end - start) +" ms.");
System.exit(0);

}

}

我真的很感激任何线索帮助我如何一次迭代到 2 个 xml 文件并更快地通过 ext_id 节点值合并,现在真的需要太多时间。

最佳答案

partial_geo_codes.xml 有多大?能装进内存吗?如果是,那么我建议使用 HashMap 对其进行索引。只需创建简单的 HashMap,并将对以 ext_id 值为键的 geo_code 节点的引用放在那里。

完成后,您只需传递一次 accomodations.xml。现在你的算法复杂度是 O(n^2),更糟糕的是涉及 n 次磁盘读取!带有 HashMap 的版本将花费 O(n) 时间,并且只需要一次通过两个 xml 文件。

关于java - 如何通过 VTD-XML 中的节点名称-值合并(加入)两个不同的 xml 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12356637/

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