XML DataSet合并

时间:2016-07-08 11:06:56

标签: c# xml out-of-memory

最终版本:

对于之前一堆随机代码不清楚的问题,我很抱歉。基本上我需要做的是将大量XML文件(一次大约100 - 200)从一个文件夹合并到一个文件中,这是一个输入和输出文件的例子:

文件1

<dokumenty  xmlns="http://www.somelink.pl/otherlink">
    <info>
        <komentarz>Text1</komentarz>
        <wersja>Text1</wersja>
        <copyright>Text1</copyright>
        <data-utworzenia>Text1</data-utworzenia>
        <system>
            <producent>Text1</producent>
            <symbol>Text1</symbol>
            <email>Text1</email>
            <wersja>Text1</wersja>
            <nazwa>Text1</nazwa>
        </system>
    </info>
    <kontrahenci>
        <kontrahent>
            <id-knt-ks>Text1</id-knt-ks>
            <nazwa>Text1</nazwa>
            <id-knt>Text1</id-knt>
        </kontrahent>
        <kontrahent>
            <id-knt-ks>Text3</id-knt-ks>
            <nazwa>Text3</nazwa>
            <id-knt>Text3</id-knt>
        </kontrahent>
    </kontrahenci>
    <towary>
        <towar>
            <id-towaru>Text1</id-towaru>
            <nazwa>Text1</nazwa>
            <id-towaru-ks>Text1</id-towaru-ks>
        </towar>
    </towary>
    <zamowienia>
        <zamowienie>
            <naglowek>
                <id-zamowienia>Text1</id-zamowienia>
                <tylko-komplet>Text1</tylko-komplet>
                <id-knt-dostawcy>Text1</id-knt-dostawcy>
                <data-wystawienia>Text1</data-wystawienia>
                <nr-zamowienia>Text1</nr-zamowienia>
                <id-knt-odbiorcy>Text1</id-knt-odbiorcy>
                <potwierdzanie>Text1</potwierdzanie>
            </naglowek>
            <pozycje>
                <pozycja>
                    <id-towaru>Text1</id-towaru>
                    <id-poz-zamowienia>Text1</id-poz-zamowienia>
                    <nr-poz-zamowienia>Text1</nr-poz-zamowienia>
                    <ilosc>Text1</ilosc>
                </pozycja>
            </pozycje>
        </zamowienie>
    </zamowienia>
</dokumenty>

文件2

<dokumenty  xmlns="http://www.somelink.pl/otherlink">
    <info>
        <komentarz>Text2</komentarz>
        <wersja>Text2</wersja>
        <copyright>Text2</copyright>
        <data-utworzenia>Text2</data-utworzenia>
        <system>
            <producent>Text2</producent>
            <symbol>Text2</symbol>
            <email>Text2</email>
            <wersja>Text2</wersja>
            <nazwa>Text2</nazwa>
        </system>
    </info>
    <kontrahenci>
        <kontrahent>
            <id-knt-ks>Text2</id-knt-ks>
            <nazwa>Text2</nazwa>
            <id-knt>Text2</id-knt>
        </kontrahent>
    </kontrahenci>
    <towary>
        <towar>
            <id-towaru>Text2</id-towaru>
            <nazwa>Text2</nazwa>
            <id-towaru-ks>Text2</id-towaru-ks>
        </towar>
    </towary>
    <zamowienia>
        <zamowienie>
            <naglowek>
                <id-zamowienia>Text2</id-zamowienia>
                <tylko-komplet>Text2</tylko-komplet>
                <id-knt-dostawcy>Text2</id-knt-dostawcy>
                <data-wystawienia>Text2</data-wystawienia>
                <nr-zamowienia>Text2</nr-zamowienia>
                <id-knt-odbiorcy>Text2</id-knt-odbiorcy>
                <potwierdzanie>Text2</potwierdzanie>
            </naglowek>
            <pozycje>
                <pozycja>
                    <id-towaru>Text2</id-towaru>
                    <id-poz-zamowienia>Text2</id-poz-zamowienia>
                    <nr-poz-zamowienia>Text2</nr-poz-zamowienia>
                    <ilosc>Text2</ilosc>
                </pozycja>
                <pozycja>
                    <id-towaru>Text3</id-towaru>
                    <id-poz-zamowienia>Text3</id-poz-zamowienia>
                    <nr-poz-zamowienia>Text3</nr-poz-zamowienia>
                    <ilosc>Text3</ilosc>
                </pozycja>
            </pozycje>
        </zamowienie>
    </zamowienia>
</dokumenty>

获取这样的新XML文件:

<dokumenty  xmlns="http://www.somelink.pl/otherlink">
    <info>
        <komentarz>Text1</komentarz>
        <wersja>Text1</wersja>
        <copyright>Text1</copyright>
        <data-utworzenia>Text1</data-utworzenia>
        <system>
            <producent>Text1</producent>
            <symbol>Text1</symbol>
            <email>Text1</email>
            <wersja>Text1</wersja>
            <nazwa>Text1</nazwa>
        </system>
    </info>
    <kontrahenci>
        <kontrahent>
            <id-knt-ks>Text1</id-knt-ks>
            <nazwa>Text1</nazwa>
            <id-knt>Text1</id-knt>
        </kontrahent>
        <kontrahent>
            <id-knt-ks>Text3</id-knt-ks>
            <nazwa>Text3</nazwa>
            <id-knt>Text3</id-knt>
        </kontrahent>
        <kontrahent>
            <id-knt-ks>Text2</id-knt-ks>
            <nazwa>Text2</nazwa>
            <id-knt>Text2</id-knt>
        </kontrahent>
    </kontrahenci>
    <towary>
        <towar>
            <id-towaru>Text1</id-towaru>
            <nazwa>Text1</nazwa>
            <id-towaru-ks>Text1</id-towaru-ks>
        </towar>
        <towar>
            <id-towaru>Text2</id-towaru>
            <nazwa>Text2</nazwa>
            <id-towaru-ks>Text2</id-towaru-ks>
        </towar>
    </towary>
    <zamowienia>
      <zamowienie>
          <naglowek>
              <id-zamowienia>Text1</id-zamowienia>
              <tylko-komplet>Text1</tylko-komplet>
              <id-knt-dostawcy>Text1</id-knt-dostawcy>
              <data-wystawienia>Text1</data-wystawienia>
              <nr-zamowienia>Text1</nr-zamowienia>
              <id-knt-odbiorcy>Text1</id-knt-odbiorcy>
              <potwierdzanie>Text1</potwierdzanie>
          </naglowek>
          <pozycje>
              <pozycja>
                  <id-towaru>Text1</id-towaru>
                  <id-poz-zamowienia>Text1</id-poz-zamowienia>
                  <nr-poz-zamowienia>Text1</nr-poz-zamowienia>
                  <ilosc>Text1</ilosc>
              </pozycja>
          </pozycje>
      </zamowienie>
        <zamowienie>
            <naglowek>
                <id-zamowienia>Text2</id-zamowienia>
                <tylko-komplet>Text2</tylko-komplet>
                <id-knt-dostawcy>Text2</id-knt-dostawcy>
                <data-wystawienia>Text2</data-wystawienia>
                <nr-zamowienia>Text2</nr-zamowienia>
                <id-knt-odbiorcy>Text2</id-knt-odbiorcy>
                <potwierdzanie>Text2</potwierdzanie>
            </naglowek>
            <pozycje>
                <pozycja>
                    <id-towaru>Text2</id-towaru>
                    <id-poz-zamowienia>Text2</id-poz-zamowienia>
                    <nr-poz-zamowienia>Text2</nr-poz-zamowienia>
                    <ilosc>Text2</ilosc>
                </pozycja>
                <pozycja>
                    <id-towaru>Text3</id-towaru>
                    <id-poz-zamowienia>Text3</id-poz-zamowienia>
                    <nr-poz-zamowienia>Text3</nr-poz-zamowienia>
                    <ilosc>Text3</ilosc>
                </pozycja>
            </pozycje>
        </zamowienie>
    </zamowienia>
</dokumenty>

如果ID不同,但不需要排序,那就太好了。

我开始学习LINQ和XSLT文件,所以对我来说这是一件全新的事情,这就是为什么在以前版本的问题中出现如此混乱的原因。

修改:

所以在Alexander Petrov的帮助下,我得到了我想要的东西,但是代码不会复制XML值,只复制节点。这是一个部分:

var kontrahent = source.Elements("kontrahenci").Nodes();
kontrahenci.Add(kontrahent);

var towar = source.Elements("towary").Elements("towar").Nodes();
towary.Add(towar);

var zamowienie = source.Elements("zamowienia").Elements("zamowienie").Nodes();
zamowienia.Add(zamowienie);

如果最后有Nodes()Elements(),则无关紧要。

1 个答案:

答案 0 :(得分:0)

// Specify your real namespace.
XNamespace ns = "http://www.somelink.pl/otherlink";

var info = new XElement(ns + "info");
var kontrahenci = new XElement(ns + "kontrahenci");
var towary = new XElement(ns + "towary");
var zamowienia = new XElement(ns + "zamowienia");

foreach (var file in Directory.EnumerateFiles(path, "*.xml"))
{
    var source = XElement.Load(file);

    var infoElements = source.Element(ns + "info")?.Elements();
    info.Add(infoElements);

    var kontrahenciElements = source.Element(ns + "kontrahenci")?.Elements();
    kontrahenci.Add(kontrahenciElements);

    var towaryElements = source.Element(ns + "towary")?.Elements();
    towary.Add(towaryElements);

    var zamowieniaElements = source.Element(ns + "zamowienia")?.Elements();
    zamowienia.Add(zamowieniaElements);
}

var result = new XElement(ns + "dokumenty", info, kontrahenci, towary, zamowienia);
result.Save(filename);