如何在VTD-XML中按节点名称值合并(连接)两个不同的xml文件?

时间:2012-09-10 17:28:03

标签: java xml vtd-xml

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

所以,我的目标是将partial_geo_codes.xml中的geo_code节点“注入”到与两个节点ext_id上的值匹配的geo_code accommodations.xml中

accommodation.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节点值更快地合并,现在真的花了太多时间。

1 个答案:

答案 0 :(得分:1)

partial_geo_codes.xml有多大?它能适合记忆吗?如果是,那么我建议使用hash-map对其进行索引。只需创建简单的HashMap,并将对ext_id值的geo_code节点的引用作为键。

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