繁体   English   中英

C# - 合并 XML 文件

[英]C# - Merge XML files

我有一个包含软件视图的 XML 文件。 这个“基本文件”具有以下结构:

<ViewsFile>
    <Categories>
        <ViewCategory Name="General">
            <Views>
                <View Name="abc">
                    <StoredProcedure>sp_abc</StoredProcedure>
                    <DefaultDisplayName>This is the view abc</DefaultDisplayName>
                </View>
                <View Name="xyz">
                    <StoredProcedure>sp_xyz</StoredProcedure>
                    <DefaultDisplayName>This is the view xyz</DefaultDisplayName>
                </View>
            </Views>
        </ViewCategory>
        <ViewCategory Name="Warehouse">
            <Views>
                <View Name="123">
                    <StoredProcedure>sp_123</StoredProcedure>
                    <DefaultDisplayName>This is the view 123</DefaultDisplayName>
                </View>
            </Views>
        </ViewCategory>
    </Categories>
</ViewsFile>

现在我想编写一个小工具,它列出了一些 XML 文件的目录,每个文件只包含一个视图。 这些文件看起来像这样:

文件 1:

        <ViewCategory Name="Warehouse">
            <Views>
                <View Name="uio">
                    <StoredProcedure>sp_uio</StoredProcedure>
                    <DefaultDisplayName>This is the view uio</DefaultDisplayName>
                </View>
            </Views>
        </ViewCategory>

文件2:

        <ViewCategory Name="General">
            <Views>
                <View Name="bla">
                    <StoredProcedure>sp_bla</StoredProcedure>
                    <DefaultDisplayName>This is the view bla</DefaultDisplayName>
                </View>
            </Views>
        </ViewCategory>

现在用户应该能够选择这些“单一视图”文件中的一个或多个,以将它们添加到基本文件的正确位置。

因此,例如应该在<ViewCategory Name="Warehouse"> -> <Views><ViewCategory Name="General"> -> <Views>文件 1,在<ViewCategory Name="General"> -> <Views><ViewCategory Name="General"> -> <Views>文件 2。

最后,基本文件将如下所示:

<ViewsFile>
    <Categories>
        <ViewCategory Name="General">
            <Views>
                <View Name="abc">
                    <StoredProcedure>sp_abc</StoredProcedure>
                    <DefaultDisplayName>This is the view abc</DefaultDisplayName>
                </View>
                <View Name="xyz">
                    <StoredProcedure>sp_xyz</StoredProcedure>
                    <DefaultDisplayName>This is the view xyz</DefaultDisplayName>
                </View>
                <View Name="bla">
                    <StoredProcedure>sp_bla</StoredProcedure>
                    <DefaultDisplayName>This is the view bla</DefaultDisplayName>
                </View>
            </Views>
            </Views>
        </ViewCategory>
        <ViewCategory Name="Warehouse">
            <Views>
                <View Name="123">
                    <StoredProcedure>sp_123</StoredProcedure>
                    <DefaultDisplayName>This is the view 123</DefaultDisplayName>
                </View>
                <View Name="uio">
                    <StoredProcedure>sp_uio</StoredProcedure>
                    <DefaultDisplayName>This is the view uio</DefaultDisplayName>
                </View>
            </Views>
        </ViewCategory>
    </Categories>
</ViewsFile>

因此我创建了以下方法,不幸的是,它只在最后一个类别的末尾添加了单个视图文件内容,而不是正确的类别。

private void btn_InstallSnippets_Click(object sender, RoutedEventArgs e)
        {

            String singleViewFile = pathToNewViews + @"\" + value;

            var xDoc1 = XDocument.Load(singleViewFile);
            var xDoc2 = XDocument.Load(baseFile);

            if (File.Exists(baseFile))
            {
                var doc1Entries = xDoc1.Descendants("View");

                var cloneEntries = doc1Entries.Select(x => new XElement(x));
                textBox_Test.Text = cloneEntries.ToString();
                xDoc2.Descendants("View").Last().AddAfterSelf(cloneEntries);

                xDoc2.Save(baseFile);

            }



        System.Windows.MessageBox.Show("Snippets successfully installed.");
        }

我需要做什么才能找到相应的类别并在那里添加内容?

提前致谢。

尝试以下 xml linq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication166
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        const string FILENAME1 = @"c:\temp\test1.xml";
        const string FILENAME2 = @"c:\temp\test2.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XDocument doc1 = XDocument.Load(FILENAME1);
            XDocument doc2 = XDocument.Load(FILENAME2);

            string category1 = (string)doc1.Descendants("ViewCategory").FirstOrDefault().Attribute("Name");
            XElement category = doc.Descendants("ViewCategory").Where(x => (string)x.Attribute("Name") == category1).FirstOrDefault();

            XElement view1 = doc1.Descendants("View").FirstOrDefault();
            XElement view = category.Descendants("Views").FirstOrDefault();
            view.Add(view1);

            string category2 = (string)doc2.Descendants("ViewCategory").FirstOrDefault().Attribute("Name");
            category = doc.Descendants("ViewCategory").Where(x => (string)x.Attribute("Name") == category2).FirstOrDefault();

            XElement view2 = doc2.Descendants("View").FirstOrDefault();
            view = category.Descendants("Views").FirstOrDefault();
            view.Add(view2);
        }
    }
 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM