合并交叉引用的XML文件

时间:2009-06-16 23:40:53

标签: c# xml vb.net linq merge

我正在共同开发一种从通信总线读取和显示数据的车辆信息系统。总线上的信令信息存储在某种数据库中(从我猜测的黑暗时代开始),只能通过提取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的唯一目的是将不同的实体链接在一起,“Signal 1”属于“Frame 1”,依此类推......

实体的唯一标识符在实体之间有所不同,但它通常是id,name或某些元素的组合。

由于项目之间存在重叠,第二个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”。

我想要实现的是将“Signal 2”添加到第一个文件并将帧引用更新为1001.

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

我很确定我的问题没有oneliner解决方案(因为问题源于糟糕的数据库结构),但是不要问这个问题是愚蠢的。

1 个答案:

答案 0 :(得分:0)

好吧,我想我的问题也没有任何花哨的解决方案。我最终使用了我在问题中描述的“解决方案”。

嗯,更重要的事情!