[英]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.