比较多个 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>