2个大的XML文件怎么比较其中的内容

jhwen 发布于 2013/09/02 10:46
阅读 2K+
收藏 0

2个XML文件的内容都是描述同一模型的。

2个XML文件的文件名一样,里面的内容绝大部分一样,只是稍有不同。

文件内容如下:

    <cim:SubControlArea rdf:ID="333003">  
            <cim:Naming.name>nm</cim:Naming.name>  
            <cimNARI:SubControlArea.recordApp>2031647</cimNARI:SubControlArea.recordApp>  
    </cim:SubControlArea>  
    <cim:BaseVoltage rdf:ID="23450010">  
            <cim:BaseVoltage.nominalVoltage>20.000000</cim:BaseVoltage.nominalVoltage>  
            <cimNARI:BaseVoltage.name>20</cimNARI:BaseVoltage.name>  
            <cimNARI:BaseVoltage.nominalI>0.000000</cimNARI:BaseVoltage.nominalI>  
            <cimNARI:BaseVoltage.v_exm>21.000000</cimNARI:BaseVoltage.v_exm>  
            <cimNARI:BaseVoltage.mva_exm>114.000000</cimNARI:BaseVoltage.mva_exm>  
    </cim:BaseVoltage>  
    <cim:Substation rdf:ID="1234">  
            <cim:Naming.name>name111</cim:Naming.name>  
            <cim:Naming.aliasName>name111</cim:Naming.aliasName>  
            <cimNARI:Substation.substationType rdf:resource="http://www.123.cn/CIM/ext-schema#ee.do"/>  
            <cimNARI:Substation.recordApp>1540111</cimNARI:Substation.recordApp>  
            <cimNARI:Substation.MaxBaseVoltage rdf:resource="#23450010"/>  
            <cim:Substation.MemberOf_SubControlArea rdf:resource="#333003"/>  
    </cim:Substation>  

其中的ID是不会变的。即 ID 对应一个节点。

场景:

1. 第一次拿到XML文件,将其中的各个节点解析成java对象后入库;

2. 由于模型有所改变(改变很小),所以第二次拿到的XML文件内容也稍有改变;

3. 对比前后2次拿到的XML文件,找出其中不同的内容,然后更新数据库表中相应的记录。

文件比较大,有52万多行,大概30M。

请问,应该怎么比较呢?

加载中
0
d
dbtop

XML的内容时有序的吗?

就是说如果内容一致,文件会不会是一样的?如果一样呢就用命令行的文本比较命令。

如果是Linux的话:diff

如果是Win的话,就行不通了。

可以看看 @XMLUnit

jhwen
jhwen
XML中的某些节点有可能会被删除,也有可能会增加节点,也有可能在某个节点下增加了属性。 XMLUnit 我试过,但是那个比较信息不好解析。 我的代码是这么写的:
0
哈喽旺仔
哈喽旺仔

用这个软件Beyond Compare 3,对比两个文件不一样的地方

0
d
dever2011

引用来自“哈喽旺仔”的答案

用这个软件Beyond Compare 3,对比两个文件不一样的地方

看清楚需求吧...你这个是文本比较器,仅仅用来比对异同的

0
n
newlife867
用SAX parser 30M的XML 一瞬间的事。
0
wanglve
wanglve
分段对文件流片段 md5 ,如果分3段,两次筛选,就可以将文件片段锁定到原来的十分之一,再操作就好办了吧。。。前提是楼主说的结构一样,只有少部分有不一样。 
wanglve
wanglve
回复 @jhwen : 文件 md5 校验 java 每个词都用空格隔开,然后输入到百度或者google。。。里面的结果多的是。。。其实不需要我在这里一定提供什么代码的。网上的资源太多了。呵呵,祝好
jhwen
jhwen
结构是一样的,只有少部分不一样。 这个片段MD5,兄弟有没有可参考的代码?
0
V
V

引用来自“wanglve”的答案

分段对文件流片段 md5 ,如果分3段,两次筛选,就可以将文件片段锁定到原来的十分之一,再操作就好办了吧。。。前提是楼主说的结构一样,只有少部分有不一样。 
可操作性还行,多分几段吧
0
純白陰影
純白陰影
sax解析比较
0
坏孩子
坏孩子
既然你可以解析到模型了,直接update到数据库就行了
jhwen
jhwen
我原先也是怎么想的,只是想问问大家有没有更好的解决方法
0
jhwen
jhwen

引用来自“dbtop”的答案

XML的内容时有序的吗?

就是说如果内容一致,文件会不会是一样的?如果一样呢就用命令行的文本比较命令。

如果是Linux的话:diff

如果是Win的话,就行不通了。

可以看看 @XMLUnit

XML中的某些节点有可能会被删除,也有可能会增加节点,也有可能在某个节点下增加了属性。 XMLUnit 我试过,但是那个比较信息不好解析。 我的代码是这么写的:
Reader r1 = new FileReader("./src-config/nariCimid.xml");
Reader r2 = new FileReader("./src-config/nariCimid11.xml");

Diff diff = new Diff(r1, r2);

DetailedDiff detail = new DetailedDiff(diff);

List changes = detail.getAllDifferences();
List<Difference> dffs = new ArrayList<Difference>();
int unmatchedNodes = 0;
for (Iterator iter = changes.iterator(); iter.hasNext();) {
 Difference d = (Difference) iter.next();
 dffs.add(d);
}

for (Difference d : dffs) {
 
 System.out.println(d.toString());
}

0
jetliu1987
jetliu1987
第一个xml文件全部插入到数据库,第二个xml文件根据id进行查找,存在就更新,不存在就插入。不知行不?
jetliu1987
jetliu1987
回复 @jhwen : 把两个xml文件入库到两张表,通过数据库进行对比合并成一张表。
jhwen
jhwen
而且我的XML节点或者节点下的属性有修改的
jhwen
jhwen
兄弟,这样做速度很慢的。几十万条数据呢
返回顶部
顶部