2009-06-16 99 views
0

我正在共同开发一种车辆信息系统,用于读取和显示来自通信总线的数据。公共汽车上的信号信息存储在某种数据库中(从我猜测的黑暗时代开始),只有通过提取xml快照才能获取数据。由于这还不够糟糕,高层管理人员认为将系统的不同部分视为不同项目(组织结构图中看起来非常好)是一个好主意,这导致更多数据库...合并交叉引用的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”属于“第一帧”,依此类推......

实体的唯一标识符在实体之间不同,但它通常是一个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> 

正如你可以看到,现在有一种“第1帧”的多个实例和“信号1”,但第二个文件将另一个信号添加到“帧1”。

我想要做到的,是加“信号2”的第一个文件,并更新帧参考1001

最好的解决方案,我想出来的,到目前为止是做一个普通的合并(使用linq),搜索整个文件中的重复项,存储所有相关的ID,最后但并非最不重要的用正确的ID替换已删除的ID。

我很确定我的问题没有oneliner解决方案(因为问题来自糟糕的数据库结构),但它不会问。

回答

0

嗯,我想我的问题也没有任何奇特的解决方案。我最终使用了我在问题中描述的“解决方案”。

那么,就更大的事情!