Я занимаюсь совместной разработкой информационной системы автомобиля, которая считывает и представляет данные из коммуникационной шины. Сигнальная информация на шине хранится в какой-то базе данных (я бы предположил, из темных веков), из которой можно получить данные только путем извлечения 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>
Все объекты (сигналы, кадры и т. Д.) Находятся непосредственно под корневым элементом, и их может быть несколько. Идентификатор генерируется, когда файл извлекается из базы данных и изменяется каждый раз. Единственная цель идентификатора состоит в том, чтобы связать различные объекты вместе, «Сигнал 1» принадлежит «Кадру 1» и так далее ...
Уникальный идентификатор объекта различается между объектами, но часто это идентификатор, имя или комбинация некоторых элементов.
Поскольку проекты перекрываются, второй 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), выполнить поиск по всему файлу на наличие дубликатов, сохранить все связанные идентификаторы и, в последнюю очередь, заменить удаленные идентификаторы на правильные.
Я почти уверен, что нет единого решения моей проблемы (поскольку проблема возникла из дрянной структуры базы данных), но было бы глупо не спрашивать.