C# Linq to XML解析文件夹中的文件

C# Linq to XML解析文件夹中的文件,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,因此,我的代码构建没有错误,但我需要改变它打开xml文档的方式。现在它可以打开一个xml文档,我需要它在我的c:上打开一个文件夹,解析文件夹中的所有xml文件。有什么帮助吗 static void Main(string[] args) { XDocument doc = XDocument.Load(@"c:\.cfg"); //Change here var query = from x in doc.Descendants("X") sel

因此,我的代码构建没有错误,但我需要改变它打开xml文档的方式。现在它可以打开一个xml文档,我需要它在我的c:上打开一个文件夹,解析文件夹中的所有xml文件。有什么帮助吗

static void Main(string[] args)
{
    XDocument doc = XDocument.Load(@"c:\.cfg");  //Change here
    var query = from x in doc.Descendants("X")
                select new
                {
                    Max1 = x.Attribute("Max").Value,
                    Min2 = x.Attribute("Min").Value
                };
    foreach (var x in query) ;
    Console.WriteLine("X");
    var query2 = from x in doc.Descendants("Y")
                 select new
                 {
                     Max3 = x.Attribute("Max").Value,
                     Min4 = x.Attribute("Min").Value
                 };
    foreach (var x in query2)
        Console.WriteLine("Y");
    var query3 = from x in doc.Descendants("ZA")
                 select new
                 {
                     Max5 = x.Attribute("Max").Value,
                     Min6 = x.Attribute("Min").Value
                 };
    foreach (var x in query3)
        Console.WriteLine("Z");
}

您应该在
目录.EnumerateFiles(@“C:\Something”,“*.xml”)

中循环查看
目录.EnumerateFiles(@“C:\Something”,“*.xml”)

您应该在
目录.EnumerateFiles(@“C:\Something”,“*.xml”)中循环查看。。。稍微“声明性”的方式:

//Program.cs
班级计划
{
静态void Main(字符串[]参数)
{
常量字符串路径=@“C:\stuff”;
Parallel.ForEach(Directory.EnumerateFiles(path,*.xml)),x=>Walk(XDocument.Load(x));
}
静态IEnumerable映射项(IEnumerable元素)
{
返回元素。选择(x=>newcalib
{
Max=x.属性(“Max”).值,
最小值=x.属性(“最小”)值
});
}
静态无效漫游(XDocument文档)
{
var xitems=MapItem(doc.substands(“XaxisCalib”);
Iter(x=>Console.WriteLine(((XaxisCalib)x:Min={0}|Max={1}),x.Min,x.Max));
var yitems=MapItem(doc.substands(“YAxisCalib”);
Iter(x=>Console.WriteLine(((YaxisCalib)Y:Min={0}| Max={1}),x.Min,x.Max));
var zitems=MapItem(doc.substands(“ZAxisCalib”);
Iter(x=>Console.WriteLine(((ZaxisCalib)Z:Min={0}|Max={1}),x.Min,x.Max));
}
}
//Exts.cs
公共静态类Exts
{
公共静态无效Iter(此IEnumerable源,动作)
{
foreach(源中的var项)
{
行动(项目);
}
}
}
//Calib.cs
公共级卡利布
{
公共字符串Max{get;set;}
公共字符串Min{get;set;}
}
。。。稍微“声明性”的方式:

//Program.cs
班级计划
{
静态void Main(字符串[]参数)
{
常量字符串路径=@“C:\stuff”;
Parallel.ForEach(Directory.EnumerateFiles(path,*.xml)),x=>Walk(XDocument.Load(x));
}
静态IEnumerable映射项(IEnumerable元素)
{
返回元素。选择(x=>newcalib
{
Max=x.属性(“Max”).值,
最小值=x.属性(“最小”)值
});
}
静态无效漫游(XDocument文档)
{
var xitems=MapItem(doc.substands(“XaxisCalib”);
Iter(x=>Console.WriteLine(((XaxisCalib)x:Min={0}|Max={1}),x.Min,x.Max));
var yitems=MapItem(doc.substands(“YAxisCalib”);
Iter(x=>Console.WriteLine(((YaxisCalib)Y:Min={0}| Max={1}),x.Min,x.Max));
var zitems=MapItem(doc.substands(“ZAxisCalib”);
Iter(x=>Console.WriteLine(((ZaxisCalib)Z:Min={0}|Max={1}),x.Min,x.Max));
}
}
//Exts.cs
公共静态类Exts
{
公共静态无效Iter(此IEnumerable源,动作)
{
foreach(源中的var项)
{
行动(项目);
}
}
}
//Calib.cs
公共级卡利布
{
公共字符串Max{get;set;}
公共字符串Min{get;set;}
}

您可以根据文件中的值创建一个新的Xml文档,并根据该文档执行任何操作(生成Excel电子表格?):


当然,由于这是一个完整的声明性语句和一条长语句,因此在必要时进行调试有点困难。

您可以根据文件中的值创建一个新的Xml文档,并根据该文档执行任何操作(生成Excel电子表格?):


当然,由于这是一个完整的声明性语句和一条长语句,因此在必要时进行调试有点困难。

请通过将代码缩进四个空格或单击编辑工具栏中的
{}
按钮来格式化代码。请通过将代码缩进四个空格或单击
{}来格式化代码
编辑工具栏中的按钮。谢谢。我是否应该取出该行:XDocument doc=XDocument.Load(@“c:\Sciclone UAC.cfg”)并用它替换?该行是否能够解析文件夹中的所有文件?您可以将循环变量(其中包含
EnumerateFiles
返回的字符串)传递到
Load
对不起,我对c有些陌生,我不明白您的意思。枚举文件(@“C:\Something”,“*.xml”);XDocument doc=XDocument.load(此处的内容)您需要使用
foreach
循环。非常感谢。我是否应该取出该行:XDocument doc=XDocument.Load(@“c:\Sciclone UAC.cfg”)并用它替换?该行是否能够解析文件夹中的所有文件?您可以将循环变量(其中包含
EnumerateFiles
返回的字符串)传递到
Load
对不起,我对c有些陌生,我不明白您的意思。枚举文件(@“C:\Something”,“*.xml”);XDocument doc=XDocument.load(此处的内容)您需要使用
foreach
循环。哇,这看起来比我的版本容易多了。我注意到一件事,虽然这不应该是在代码开始时,但它需要在开始解析之前打开xm文档:static void Main(string[]args){const string path=@“C:\stuff”;Parallel.ForEach(Directory.EnumerateFiles(path,“*.xml”)、x=>Walk(XDocument.Load(x));}@Casey,无论
Main
方法放在哪里,因为它是应用程序启动时调用的第一个方法。虽然我已经把它移到了顶部进行澄清。还有Exts.cs和Calib.cs代码的意义是什么?我应该为此打开一个全新的控制台应用程序吗?或者我应该如何将其集成到?@Casey,以保持
// Program.cs
class Program
{
    static void Main(string[] args)
    {
        const string path = @"C:\stuff";
        Parallel.ForEach(Directory.EnumerateFiles(path, "*.xml"), x => Walk(XDocument.Load(x)));
    }

    static IEnumerable<Calib> MapItem(IEnumerable<XElement> elements)
    {
        return elements.Select(x => new Calib
        {
            Max = x.Attribute("Max").Value,
            Min = x.Attribute("Min").Value
        });
    }

    static void Walk(XDocument doc)
    {
        var xitems = MapItem(doc.Descendants("XaxisCalib"));
        xitems.Iter(x => Console.WriteLine("(XaxisCalib) X: Min = {0} | Max = {1}", x.Min, x.Max));

        var yitems = MapItem(doc.Descendants("YAxisCalib"));
        yitems.Iter(x => Console.WriteLine("(YaxisCalib) Y: Min = {0} | Max = {1}", x.Min, x.Max));

        var zitems = MapItem(doc.Descendants("ZAxisCalib"));
        zitems.Iter(x => Console.WriteLine("(ZaxisCalib) Z: Min = {0} | Max = {1}", x.Min, x.Max));
    }
}

// Exts.cs
public static class Exts
{
    public static void Iter<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (var item in source)
        {
            action(item);
        }
    }
}

// Calib.cs
public class Calib
{
    public string Max { get; set; }
    public string Min { get; set; }
}
var fileData = new XElement("root",
 from file in New System.IO.DirectoryInfo("C:\Something").GetFiles() 
    where file.Extension.Equals(".xml", String Comparison.CurrentCultureIgnoreCase) 
    Let doc = XElement.Load(file.FullName)
    select new XElement("File", 
      new XAttribute("Path", file.FullName), 
      select new XElement("XAxisCalibs", 
         from x in doc.Descendants("XAxisCalib") 
         select new XElement("XAxisCalib", 
              new XAttribute("Max", x.Attribute("Max").Value),
              new XAttribute("Min", x.Attribute("Min").Value)
         )
      ),
      select new XElement("YAxisCalibs", 
         from y in doc.Descendants("YAxisCalib") 
         select new XElement("YAxisCalib", 
              new XAttribute("Max", x.Attribute("Max").Value),
              new XAttribute("Min", x.Attribute("Min").Value)
         )
      ),
      select new XElement("ZAxisCalibs", 
         from z in doc.Descendants("ZAxisCalib") 
         select new XElement("ZAxisCalib", 
              new XAttribute("Max", x.Attribute("Max").Value),
              new XAttribute("Min", x.Attribute("Min").Value)
         )
      )
    );