0 0

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

 

 

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。

 

请问,应该怎么比较呢?

 

 

 


问题补充:已经找到了解决的方法,可以使用 xmlunit 来做。
相关jar包:
http://mirrors.ibiblio.org/pub/mirrors/maven2/xmlunit/xmlunit/1.3/xmlunit-1.3.jar

代码:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

import org.custommonkey.xmlunit.Diff;
import org.junit.Test;
import org.xml.sax.SAXException;

public class XMLCompare {

@Test
public void compare() {

try {
Reader r1 = new FileReader("./src-config/nariCimid.xml");
Reader r2 = new FileReader("./src-config/nariCimid11.xml");

Diff diff = new Diff(r1, r2);

StringBuffer buf = diff.appendMessage(new StringBuffer());

System.out.println(buf.toString());

// diff.overrideDifferenceListener(new
// IgnoreTextAndAttributeValuesDifferenceListener());
// assertTrue("XML was not similar", diff.similar());
// assertFalse(diff.identical());

//XMLAssert.assertXMLEqual(r1, r2);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

}

2个XML文件都是52万多行,每个文件大概30M。

由于涉及到商业机密,这里就不提供XML文件了。

程序耗时22秒多。

测试结果:
[different] Expected text value '内蒙' but was '内蒙1' - comparing <cim:Naming.name ...>内蒙</cim:Naming.name> at /RDF[1]/SubControlArea[1]/Naming.name[1]/text()[1] to <cim:Naming.name ...>内蒙1</cim:Naming.name> at /RDF[1]/SubControlArea[1]/Naming.name[1]/text()[1]
2013年8月27日 09:17

3个答案 按时间排序 按投票排序

0 0

最简单,但未必是最好的方法。可以把两个xml都生成对应的pojo,然后,通过二个pojo之间的比较,记下对应的id,就OK了。

2013年8月27日 23:49
0 0

既然已经存入数据库中一份了,那么只需要把第二个xml放入内存解析就可以了。
每次从xml取出500条(或者更多,根据实际情况自己决定),根据id从数据库中取出这500条,对比,如果有变化,如果有变化,批量更新;直到把50w循环一遍。

2013年8月27日 12:45
0 0

如果是要把xml数据导入数据库,可以考虑使用一个叫vtd.xml的东西。占内存很小,速度很快

2013年8月27日 10:09

相关推荐

    XML文件,批量进行替换文本内容

    1、可以批量同时处理多个XML文件,适合需要批量修改XML文件中部分内容的需求 2、可以支持文本替换,就是说,只要匹配其中的内容,就可以实现一键将原本的文本内容或者节点的内容,替换成需要替换的内容 可扩展的功能...

    xml.zip_matlab读取xml文件实例_xml文件读取

    例如,假设我们有一个名为`data.xml`的XML文件,其内容如下: ```xml &lt;name&gt;Item 1 &lt;description&gt;This is item 1. &lt;item id="2"&gt; &lt;name&gt;Item 2 &lt;description&gt;This is item 2. ``` 在MATLAB中,我们...

    C++读取XML文件内容

    本程序是用C++来读取一个XML文档中的内容,其中包括两方面的内容:一,创建一个XML文档;二,读取指定XML文档中的内容,非常适合于初学XML的人的一个C++源代码

    tinyxml2解析XML文件读取数据

    本项目“tinyxml2解析XML文件读取数据”主要关注如何使用tinyxml2库来高效地解析XML文件并提取其中的数据。以下将详细介绍tinyxml2库的关键功能和使用方法。 1. **tinyxml2库介绍** - tinyxml2提供了DOM(Document...

    excel读取生成xml文件

    这将根据映射信息生成一个XML文件,其中包含工作表中的数据。 5. **处理XML文件**:生成的XML文件可以用任何XML编辑器或编程语言(如Python、Java、C#等)进一步处理。例如,可以使用XPath查询语言来提取特定数据,...

    halcon XML文件处理函数,halcon函数手册,Halcon

    2. `write_xml_file`:相反,这个函数将HALCON的数据结构写入XML文件,使得用户可以保存和共享设置、参数或其他配置信息。 3. `gen_xml_element`:此函数用于创建XML元素,包括元素名称、属性和子元素,构建XML文档...

    自动生成XML文件列表工具

    这个“自动生成XML文件列表工具”就是针对特定需求设计的,它能够快速地将指定目录下的所有文件信息整理并生成一个XML文件。这样的工具在软件更新、版本控制、数据备份等场景中十分有用,因为它提供了标准格式化的...

    C++读取XML文件

    C++作为一门强大的编程语言,提供了多种库来处理XML文件,其中之一就是TinyXML库。本教程将深入探讨如何使用TinyXML解析器在C++中读取XML文件。 TinyXML是一个小型、轻量级的开源库,设计用于在C++中解析XML文档。...

    xml文件读写demo

    2. 使用`Load`方法加载XML文件内容。 3. 使用DOM(Document Object Model)接口访问和操作XML元素和属性。 写入XML文件的流程大致为: 1. 创建`XmlDocument`实例。 2. 创建所需的`XmlElement`节点结构。 3. 添加...

    xml文件处理Demo

    这通常涉及读取XML文件,修改其中的节点,然后保存更改。在Python中,可以使用`ElementTree`库进行操作,例如: ```python import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse('TestXmlTree.xml') ...

    XML文件创建数据库表

    例如,我们可以先将XML文件内容读入一个CLOB字段,然后通过解析XML来创建表: ```sql CREATE TABLE xml_table (xml_data CLOB); INSERT INTO xml_table VALUES (BFILENAME('XML_DIR', 'data.xml')); SELECT DBMS_...

    小米XML文件转Vcard.zip

    1. 解析XML文件:首先,我们需要读取XML文件并解析其中的联系人数据。这通常涉及使用XML解析库,如Python的ElementTree或Java的DOM解析器,来提取每个联系人的属性。 2. 创建VCard对象:根据解析出的XML数据,创建...

    android中apk包中的xml文件解密

    这会生成一个解压后的目录结构,其中XML文件以文本形式存在,可直接阅读。 2. **解析资源表**:`resources.arsc`文件包含了资源的ID和名称映射。解析这个文件可以帮助我们理解XML中使用的资源ID对应的实际内容。 3...

    Rpt文件转Xml文件

    总结起来,将RPT文件转换为XML文件涉及了对RPT文件格式的理解、选择合适的库(如NEABean)、解析RPT内容、构建和序列化XML结构等多个环节。这个过程需要对Java编程、XML和报表设计工具有深入了解,同时也需要解决...

    MATLAB读取XML格式的数据文件

    这个函数将XML文件解析成一个XML文档对象模型(DOM),然后可以通过DOM API访问XML文件中的元素、属性和文本。例如,如果你有一个名为"data.xml"的XML文件,你可以这样读取它: ```matlab doc = xmlread('data.xml'...

    Kettle数据导出为XML文件

    在描述中提到的博客链接虽然没有提供具体细节,但可以推测博主可能分享了如何使用Kettle创建一个转换,该转换将数据从各种来源(如数据库、CSV文件等)提取出来,并将其格式化为XML文件。这种操作在数据交换、数据...

    字符串转化为XML文件

    字符串转化为XML文件 本文将详细介绍字符串转化为XML文件的知识点,包括XML文件的基本结构、StringBuilder类的使用、XML文档对象模型(DOM)、XML文件的保存等。 XML文件的基本结构 XML(Extensible Markup ...

    C#解析XML文件并用WinForm显示

    在本文中,我们将深入探讨如何使用C#编程语言解析XML文件,并将其内容在Windows Forms(WinForm)应用程序中展示。XML(eXtensible Markup Language)是一种数据存储和交换的标准格式,而C#是Microsoft .NET框架下...

    QT QTreewidget显示和修改xml文件并导出

    在本项目中,QTreeWidget被用作XML文件内容的可视化表示,其中每个节点可能代表XML文档的一个元素。 3. **XML处理**:XML(eXtensible Markup Language)是一种用于存储和传输结构化数据的标准格式。在本项目中,...

    SV660N系列EtherCAT通信XML文件

    对于SV660N系列设备,这个XML文件可能包含了以下内容: 1. **设备标识**:定义设备在网络中的唯一ID,这对于 EtherCAT 网络中的设备识别至关重要。 2. **网络拓扑**:描述了设备在网络中的位置,包括上位机、从站...

Global site tag (gtag.js) - Google Analytics