使用XmlUnit Diff库比较XML时忽略对象顺序的通用实现方案咨询
XmlUnit Diff库比较XML时忽略对象顺序的通用实现方案咨询
我正在开发一个XML比较工具,核心需求是忽略同级对象的顺序,而非仅仅忽略单个节点内的属性顺序。举个实际场景的例子:
XML 1:
<Root> <Vehicles> <Vehicle> <Registration>ABC123</Registration> <Make>Ford</Make> <Model>Focus</Model> <Doors>4</Doors> </Vehicle> <Vehicle> <Registration>DEF789</Registration> <Make>BMW</Make> <Model>330E</Model> <Doors>4</Doors> </Vehicle> </Vehicles> </Root>
XML 2:
<Root> <Vehicles> <Vehicle> <Registration>DEF789</Registration> <Make>BMW</Make> <Model>330E</Model> <Doors>4</Doors> </Vehicle> <Vehicle> <Registration>ABC123</Registration> <Make>Ford</Make> <Model>Focus</Model> <Doors>4</Doors> </Vehicle> </Vehicles> </Root>
这两个XML里的<Vehicle>节点顺序完全颠倒,但逻辑上应该判定为匹配。但XmlUnit的Diff类会直接按索引对比两边的节点——比如拿左边第0个Vehicle和右边第0个Vehicle对比,结果就会出现Registration(ABC123 vs DEF789)、Make(Ford vs BMW)等无意义的差异。
我查了不少资料,大多都是讲解如何忽略属性顺序的方案,但几乎找不到先自动匹配同类对象、再对比内部属性的通用实现思路。目前我能做到的是针对特定集合(比如Vehicle集合),通过某个唯一标识字段(比如Registration)来配对两边的节点,但这种方式需要为每个不同的集合单独写适配逻辑:比如驾驶员集合用Forename配对,理赔记录用ClaimID配对,以此类推。
但我要处理的是保险报价类的XML,里面有上百个可能乱序的集合(车辆、驾驶员、理赔记录、违章记录、健康状况,还有各种信用/欺诈评分的enrichment集合等等),逐个写适配方法显然效率极低且不现实。
我尝试过重写DefaultNodeMatch类,但没找到有效的通用实现方式。有没有大佬能给点可行的思路?
内容来源于stack exchange
相关产品推荐
相关产品推荐

