Присоединяйтесь ко многим XML-документам, чтобы создать новый XML-документ с помощью C # - PullRequest
0 голосов
/ 26 сентября 2018

Мне нужно объединить множество XML-файлов в разные папки, чтобы сформировать один XML-файл.Пример, приведенный ниже.

На основе Displayid и Viewid мы должны быть в состоянии найти, куда добавить узлы при объединении xml.

Я могу получить файлы по папкепуть с использованием каталогов, но я не могу решить, как добавить узлы в другой XML-файл.

Первый XML:

<root>
    <Display>
        <Displayid>0</Displayid>
        <view>
            <viewid>abc</viewid>
            <Screen>
                <ScreenId>abcd</ScreenId>
            </screen>
        </view>
    </Display>
</root>

Второй XML

<root>
    <Display>
        <Displayid>0</Displayid>
        <view>
            <viewid>def</Viewid>
            <Screen>
                <ScreenId>abcd</ScreenId>
            </screen>
        </view>
    </Display>
</root>

Третий XML:

<root>
    <Display>
        <Displayid>1</Displayid>
        <view>
            <viewid>efgh</viewid>
            <Screen>
                <ScreenId>ijklm</ScreenId>
            </screen>
        </view>
    </Display>
</root>

Результат

<root>
    <Display>
        <Displayid>0</Displayid>
        <view>
            <viewid>abc</viewid>
            <Screen>
                <ScreenId>abcd</ScreenId>
            </screen>
        </view>
        <view>
            <viewid>def</viewid>
            <Screen>
                <ScreenId>abcd</ScreenId>
            </screen>
        </view>
    </Display>
    <Display>
        <Displayid>1</Displayid>
        <view>
            <viewid>efgh</viewid>
            <Screen>
                <ScreenId>ijklm</ScreenId>
            </screen>
        </view>
    </Display>
</root>

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Поскольку вы уже знаете, каково значение displayId, вы можете использовать Linq to XML для достижения функциональности, что-то похожее на приведенный ниже код (здесь я принимаю displayId как 0, упомянутое в вашей спецификации ввода и вывода) -

            var xml1 = XDocument.Load("1.xml");
            var xml2 = XDocument.Load("2.xml");
            var xml3 = XDocument.Load("3.xml");

            var displayId = xml1.Descendants("Display").Descendants("Displayid").Where(a => a.Value == "0").FirstOrDefault().Value;           

            if (displayId == "0")
            {
                xml1.Descendants("view").LastOrDefault().AddAfterSelf(xml2.Descendants("view"));

            }
            xml1.Descendants("Display").LastOrDefault().AddAfterSelf(xml3.Descendants("Display"));
            xml1.Save("4.xml");

Пожалуйста, пройдите через Linq для XML здесь. и о деталях пространства имен здесь -

Есть несколько методов в пространстве именкоторый покажет вам, как работать с XML, аналогично AddAfterSelf.

0 голосов
/ 26 сентября 2018

Вы можете попробовать следующее:

  1. Создать xsd для вашего окончательного / выходного xml.
  2. Выполнить итерацию по всем вашим XML-файлам, которые вы хотите присоединить, а затем десериализовать каждый файлв объект и сохраните его в коллекцию.
  3. Опять итерируйте коллекцию, полученную на предыдущем шаге, и напишите выражение LINQ для сопоставления Displayid и Viewid.
  4. Сериализация финалаобъект для генерации целевого XML.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...