比较多个 XML 个文件的内容并匹配它们
Comparing the content of multiple XML Files and Match them
我有两个文件夹,每个文件夹都包含一定数量的 .xml 文件,文件名不同。每个 XML 文件包含一行,如下所示:
<general name = "something" ....... version = "something" .... >
每个文件夹都有一个 .xml 文件共享相同的 name
,在上例中其值为 "something"
。但是,它们的文件名不同。
我的目标是,对于每个文件夹中的每个文件,通过 .xml 文件中的名称匹配它们并比较它们的版本号。
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication21
{
class Program
{
static string[] FOLDERS = {@"c:\temp\folder1\", @"c:\temp\folder2"};
static void Main(string[] args)
{
List<General> generals0 = new List<General>();
List<General> generals1 = new List<General>();
for (int i = 0; i < 2; i++ )
{
string folder = FOLDERS[i];
foreach (string file in Directory.GetFiles(folder, "*.Xml"))
{
XDocument doc = XDocument.Load(file);
XElement xGeneral = doc.Descendants("general").FirstOrDefault();
if (xGeneral != null)
{
string name = (string)xGeneral.Attribute("name");
string version = (string)xGeneral.Attribute("version");
if (name != null)
{
General general = new General();
switch(i)
{
case 0 :
generals0.Add(general);
break;
case 1 :
generals1.Add(general);
break;
}
general.filename = file;
general.name = name;
general.version = version;
}
}
}
}
//join to lists
var results = (from g0 in generals0
join g1 in generals1 on g0.name equals g1.name
select new { g0 = g0, g1 = g1 }
).ToList();
}
}
public class General
{
public string filename { get; set; }
public string name { get; set; }
public string version { get; set; }
}
}
在 XSLT 3.0 中,
<xsl:template name="xsl:initial-template">
<xsl:variable name="one"
select="map:merge(collection('folder1?select=*.xml')
//general ! map{@name : string(@version)})"/>
<xsl:variable name="two"
select="map:merge(collection('folder2?select=*.xml')
//general ! map{@name : string(@version)})"/>
<xsl:variable name="combined"
select="map:merge(($one, $two),
map{'duplicates': 'combine'})"/>
<xsl:for-each select="map:keys($combined)">
name={.} : versions={$combined?.}
</xsl:for-each>
</xsl:template>
我有两个文件夹,每个文件夹都包含一定数量的 .xml 文件,文件名不同。每个 XML 文件包含一行,如下所示:
<general name = "something" ....... version = "something" .... >
每个文件夹都有一个 .xml 文件共享相同的 name
,在上例中其值为 "something"
。但是,它们的文件名不同。
我的目标是,对于每个文件夹中的每个文件,通过 .xml 文件中的名称匹配它们并比较它们的版本号。
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication21
{
class Program
{
static string[] FOLDERS = {@"c:\temp\folder1\", @"c:\temp\folder2"};
static void Main(string[] args)
{
List<General> generals0 = new List<General>();
List<General> generals1 = new List<General>();
for (int i = 0; i < 2; i++ )
{
string folder = FOLDERS[i];
foreach (string file in Directory.GetFiles(folder, "*.Xml"))
{
XDocument doc = XDocument.Load(file);
XElement xGeneral = doc.Descendants("general").FirstOrDefault();
if (xGeneral != null)
{
string name = (string)xGeneral.Attribute("name");
string version = (string)xGeneral.Attribute("version");
if (name != null)
{
General general = new General();
switch(i)
{
case 0 :
generals0.Add(general);
break;
case 1 :
generals1.Add(general);
break;
}
general.filename = file;
general.name = name;
general.version = version;
}
}
}
}
//join to lists
var results = (from g0 in generals0
join g1 in generals1 on g0.name equals g1.name
select new { g0 = g0, g1 = g1 }
).ToList();
}
}
public class General
{
public string filename { get; set; }
public string name { get; set; }
public string version { get; set; }
}
}
在 XSLT 3.0 中,
<xsl:template name="xsl:initial-template">
<xsl:variable name="one"
select="map:merge(collection('folder1?select=*.xml')
//general ! map{@name : string(@version)})"/>
<xsl:variable name="two"
select="map:merge(collection('folder2?select=*.xml')
//general ! map{@name : string(@version)})"/>
<xsl:variable name="combined"
select="map:merge(($one, $two),
map{'duplicates': 'combine'})"/>
<xsl:for-each select="map:keys($combined)">
name={.} : versions={$combined?.}
</xsl:for-each>
</xsl:template>