如何解决C#-合并XML文件
我有一个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>
现在,用户应该能够选择这些“一个视图”文件中的一个或多个,以将它们添加到基本文件中的正确位置。
例如,文件1应该添加到<ViewCategory Name="Warehouse"> -> <Views>
下,文件2应该添加到<ViewCategory Name="General"> -> <Views>
下。
最后,基本文件如下所示:
<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);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。