【发布时间】:2009-06-16 23:40:53
【问题描述】:
我正在共同开发一个车辆信息系统,该系统从通信总线读取和呈现数据。总线上的信号信息存储在某种数据库中(我猜是从黑暗时代开始的),只有通过提取 xml 快照才能从中获取数据。由于这还不够糟糕,高层管理人员认为将系统的不同部分视为不同的项目(在组织结构图中看起来非常好)是一个好主意,这会导致更多的数据库......
现在我有责任将这些 xml 文件合并为一个,在我开始将头撞到墙上之前,我认为如果有任何巧妙的解决方案可以解决我的问题,最好与各位天才核实一下。
xml的结构有点像这样:
<data>
<frame ID="1001">
<attributes>
<name>Frame 1</name>
<description>The first frame</description>
</attributes>
<references/>
</frame>
<signal ID="1002">
<attributes>
<signalid>1</signalid>
<name>Signal 1</name>
</attributes>
<references>
<frame ID="1001"/>
</references>
</signal>
</data>
所有实体(信号、帧等)都位于根元素的正下方,每个实体可以有多个。 ID 是在从数据库中提取文件时生成的,并且每次都会更改。 id的唯一目的是将不同的实体链接在一起,“信号1”属于“帧1”等等......
实体的唯一标识符因实体而异,但通常是 id、名称或某些元素的组合。
由于项目之间存在重叠,第二个 xml 文件可能如下所示:
<data>
<frame ID="2001">
<attributes>
<name>Frame 1</name>
<description>The first of many frames</description>
</attributes>
<references/>
</frame>
<signal ID="2002">
<attributes>
<signalid>1</signalid>
<name>Signal 1</name>
</attributes>
<references>
<frame ID="2001"/>
</references>
</signal>
<signal ID="2003">
<attributes>
<signalid>2</signalid>
<name>Signal 2</name>
</attributes>
<references>
<frame ID="2001"/>
</references>
</signal>
</data>
如您所见,“Frame 1”和“Signal 1”现在有多个实例,但第二个文件向“Frame 1”添加了另一个信号。
我想要实现的是将“信号 2”添加到第一个文件并将帧引用更新为 1001。
到目前为止,我想出的最佳解决方案是进行简单的合并(使用 linq),搜索整个文件中的重复项,存储所有相关的 ID,最后但并非最不重要的是用正确的 ID 替换已删除的 ID。
我很确定我的问题没有单一的解决方案(因为问题源于糟糕的数据库结构),但不问是愚蠢的。
【问题讨论】: