解决方案 »
- winform点击按钮弹出网页
- webservice发布问题
- vs 2008 新建项目后无法加载界面
- 关于彩票系统的问题
- C# 操作word 插入直线,求代码
- 如何想互联网的输出流中输出16进制数?
- 高分急求!如何在服务器上创建文件,希望大虾们帮帮忙,在线等
- 50分求解!!!如何把。ASPX文件里的文本框变量提交到一个ASP的接收文件!!!!!(菜鸟级问题,进者有分)
- 向自定义的panel里面放一个GridView GridView宽度大于panel时自定义panel画的边框就没了(只是GridView覆盖的部分) 希望大家帮忙 谢谢了
- c#窗体ComboBox空间想实现:按下删除键,控件的内容将清空,点击其它地方依旧为空,该怎么做
- 求助,关于ZedGraph控件的坐标轴
- 如何用c#判断一组数是否符合正态分布,并绘出正态分布曲线图.100分,出结果马上给.
可以的。
不过看你要合并的xml里面的元素会不会完全相同啊。如果相同你要怎么处理。
xml里面的层数会不会一样。这都要考虑。
起码要知道怎么个合并法。
这就麻烦,一个一个元素的判断。还要确定元素所在的层数。
一一逐个判断。再合并。你多个要合并的xml文件可以规范一点吗。
那怎么办,怎么个合并法。没有规律是没法合并的。
<?xml version="1.0" encoding="utf-8"?>
<A>
<B>
<Item SystemTool="1" ToolType="2" Role="" JC="" AC="" DRC=""/>
<Item1 a="1" b="2"/>
</B>
<C VA="5"/>
<D VALUES="6"/>
<F V="100"/>
<E>
<G V="11"/>
<C VA="50"/>
</E>
</A>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;namespace Linq2Xml_MergeXml
{
class Program
{
static void Main(string[] args)
{
var xml1 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<A>
<B>
<Item SystemTool=""1"" ToolType=""2"" Role="""" JC="""" AC=""3"" DRC=""""/>
</B>
<C VALUES=""4""/>
<E>
<F V=""10""/>
</E>
</A>";
Console.WriteLine(xml1);
Console.WriteLine("------------"); var xml2 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<A>
<B>
<Item SystemTool=""1"" ToolType=""2"" Role="""" JC="""" AC="""" DRC=""""/>
<Item1 a=""1"" b=""2""/>
</B>
<C VA=""5""/>
<D VALUES=""6""/>
<E>
<G V=""11""/>
</E>
</A>"; var xdoc1 = XDocument.Parse(xml1);
var xdoc2 = XDocument.Parse(xml2);
xdoc1.Merge(xdoc2);
Console.WriteLine(xdoc1.ToString());
Console.Read();
} } public static class XDocumentExtension
{
public static void Merge(this XDocument xdoc, XDocument mergedXdoc)
{
foreach (var node in xdoc.Descendants())
{
// Add nonexistence attributes
var target = mergedXdoc.Descendants(node.Name);
foreach (var att in target.Attributes())
{
// Check existence attributes by name not value
if (!node.Attributes().Select(t => t.Name.ToString())
.Contains(att.Name.ToString()))
node.Add(new XAttribute(att));
}
// Add nonexistence nodes
var targetChilds = target.Descendants();
var existsNodeNames = node.Descendants().Select(n => n.Name);
var noExistNodes = targetChilds.Where(t => !existsNodeNames.Contains(t.Name));
foreach (var newNode in noExistNodes)
node.LastNode.AddAfterSelf(newNode);
}
} }
}
{
foreach (var node in xdoc.Descendants())
{
// Add nonexistence attributes
var target = mergedXdoc.Descendants(node.Name);
foreach (var att in target.Attributes())
{
// Check existence attributes by name not value
if (!node.Attributes().Select(t => t.Name.ToString())
.Contains(att.Name.ToString()))
node.Add(new XAttribute(att));
}
// Add nonexistence nodes
var targetChilds = target.Descendants();
var existsNodeNames = node.Descendants().Select(n => n.Name);
var noExistNodes = targetChilds.Where(t => !existsNodeNames.Contains(t.Name)
&& t.Parent.Name == node.Name);
foreach (var newNode in noExistNodes)
node.Add(newNode);
}
}
{
XmlNode xnRoot1 = xd1.SelectSingleNode("/").ChildNodes[1];
XmlNode xnRoot2 = xd2.SelectSingleNode("/").ChildNodes[1];
string rootName = xnRoot2.Name;
for (int i = 0; i < xnRoot2.ChildNodes.Count; i++)
{
string nodeName = xnRoot2.ChildNodes[i].Name;
if (xnRoot1.SelectNodes(nodeName).Count == 0)
{
XmlNode xnTemp = xd1.ImportNode(xnRoot2.ChildNodes[i], true);
xnRoot1.AppendChild(xnTemp);
}
else
{
XmlNode xnDest = xnRoot1.SelectNodes(nodeName)[0];
for (int j = 0; j < xnRoot2.ChildNodes[i].ChildNodes.Count; j++)
{
XmlNode xnTemp = xd1.ImportNode(xnRoot2.ChildNodes[i].ChildNodes[j], true);
xnDest.AppendChild(xnTemp);
}
for (int k = 0; k < xnRoot2.ChildNodes[i].Attributes.Count; k++)
{
XmlAttribute xaTemp = xd1.CreateAttribute(xnRoot2.ChildNodes[i].Attributes[k].Name);
xaTemp.Value = xnRoot2.ChildNodes[i].Attributes[k].Value;
xnDest.Attributes.Append(xaTemp);
}
}
} return xd1;
} static void Main(string[] args)
{
var xml1 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<A>
<B>
<Item SystemTool=""1"" ToolType=""2"" Role="""" JC="""" AC=""3"" DRC=""""/>
</B>
<C VALUES=""4""/>
<E>
<F V=""10""/>
</E>
</A>"; var xml2 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<A>
<B>
<Item SystemTool=""1"" ToolType=""2"" Role="""" JC="""" AC="""" DRC=""""/>
<Item1 a=""1"" b=""2""/>
</B>
<C VA=""5""/>
<D VALUES=""6""/>
<E>
<G V=""11""/>
</E>
</A>"; XmlDocument xdoc1 = new XmlDocument();
xdoc1.LoadXml(xml1);
XmlDocument xdoc2 = new XmlDocument();
xdoc2.LoadXml(xml2); XmlDocument result = Merge(xdoc1, xdoc2);
}
这就麻烦,一个一个元素的判断。还要确定元素所在的层数。
一一逐个判断。再合并。
if (xnRoot1.SelectNodes(nodeName).Count == 0) 这句报错提示 “表达式的计算结果必须为节点集。”