判断两个XML文件结构与内容是否相同

本文档描述了如何在软件升级过程中确保高版本导出的XML文件与低版本的结构和内容一致。通过对比两个XML文件的节点信息,实现了递归比较功能,忽略节点顺序,确保数据的一致性。在测试过程中,使用ModelParser类进行XML文件的比较,确保高版本导出的文件能正确转换为低版本格式。
摘要由CSDN通过智能技术生成

1. 引入

  目前公司的这款软件导入导出数据库信息的方法是:组织数据的内容和结构  利用MS com的sax解析 储存数据为XML格式

    优点是可以选择部分导出

    缺点是速度慢文件导出的文件庞大,若客户出现导入导出错误要重现或者调试困难

  由于软件持续更新所以不同版本的,XML有差异

  现客户需求将高版本的软件导出成  低版本XML,保证从任何高版本导出的文件    与  低版本 原先的格式与内容一致

  我们实现了功能之后为了测试功能,要写单元测试

 

2. 分析

   要测试高版本导出的文件的 内容和格式能完全导出成低版本

   首先要通过低版本 生成一个数据库,将内容全部导出成A

   再将A导入到高版本确保A的信息完全转化成高版本的结构

   将高版本导出成低版本文件B

   比较AB的内容和结构

   B除某些少部分信息与结构,其他必须完全与低版本一致

 

3. 实现

  将A与B通过 dom 解析,取出各自的节点进行一一比较直到所有在A中的节点的位置和信息都与B中一致后,才可判定2者一致,由于导出时数据库的结构不同,XML的文件中节点的顺序可能不同在我们的软件中这种情况是可以认为是一致的。顺序不用考虑,因此要求UT忽略顺序

 

  比较主要分为3步

    1)在A和B中取出某个节点

    2)比较两个节点的信息是否一致

    3)比较这两个节点的子节点信息是否一致

  XML格式为树状结构,除根节点和叶子节点外每个节点均有父节点和子节点,另外本软件导出的文件只会有一个根节点

  因此可以进行递归查找进一步把流程改为:

    1)从A和B中取出根节点,对根节点进行compare(若一致则可以确定两文件内容、结构一致)

      

    2)compare流程

      (1)比较当前节点信息若不一致则返回失败

      (2)若一致,则取出AB所有的子节点,遍历A的子节点  去 B的子节点集中查找 (递归调用Compare进行判断)若所有A的子节点都能在B中找到,则判断AB节点相同(前提AB中子节点数量一致)

 

#include "ModelParser.h"
#include "IExporterDocumentTranslator.h"

 

.....将低版本文件导入到高版本

.....导出成低版本

 

ModelParser version4Parser(fileOfversion4);//ModelParser类用来解析XML文件
ModelParser exportedFileParser(exportedFile);
ASSERT(version4Parser.IsValid());
ASSERT(exportedFileParser.IsValid());

//Compare it with the 4.0 file, their datas should be consistent
ASSERT(version4Parser.Compare(exportedFileParser));

 

ModelParser类及实现

 

ModelParser.h

#pragma once

#include"XMLDOMNodeParser.h"

class ModelParser
{
public:
ModelParser(const String& modelFilePath);

/
// Compare the content with another file, if the files are the same return true (exportas test use only)
bool Compare(const ModelParser& otherModel) const;
bool IsValid() const;

private:
shared_ptr<XMLDOMNodeParser> rootInterchangeFile;
IXMLDOMNodePtr GetInterchangeFile(IXMLDOMNodeListPtr listPtr);
};

ModelParser.cpp

#include "StdAfx.h"
#include "ModelParser.h"

ModelParser::ModelParser(const String& modelFilePath) :
rootInterchangeFile(NULL)
{
IXMLDOMDocumentPtr docPtr;
docPtr.CreateInstance(__

要逐节点比较两个XML文件的新增、修改和删除内容,可以使用Python中的xml.etree.ElementTree模块。 首先,使用ElementTree将两个XML文件解析为树形结构,并获取它们的根节点。然后,对这两个根节点进行逐节点比较判断节点是否存在、节点的标签是否相同、节点的属性是否相同以及节点的文本内容是否相同。如果节点存在但是属性或文本内容有所变化,则表示节点内容被修改。如果节点不存在,则表示节点被删除或新增。 下面是一个示例代码,用于比较两个XML文件的差异: ```python import xml.etree.ElementTree as ET # 解析两个XML文件,并获取它们的根节点 tree1 = ET.parse('file1.xml') root1 = tree1.getroot() tree2 = ET.parse('file2.xml') root2 = tree2.getroot() # 逐节点比较两个XML文件 for child1 in root1: # 判断节点是否存在于第二个XML文件中 child2 = root2.find(child1.tag) if child2 is None: print('节点被删除:', child1.tag) else: # 判断节点的属性是否相同 if child1.attrib != child2.attrib: print('节点属性被修改:', child1.tag) # 判断节点的文本内容是否相同 if child1.text != child2.text: print('节点文本内容被修改:', child1.tag) # 判断第二个XML文件是否存在新增节点 for child2 in root2: child1 = root1.find(child2.tag) if child1 is None: print('节点被新增:', child2.tag) ``` 请注意,这只是一个简单的示例代码,实际情况可能更加复杂,需要根据具体的XML文件格式和需求进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值