C# Linq to XML解析文件夹中的文件
因此,我的代码构建没有错误,但我需要改变它打开xml文档的方式。现在它可以打开一个xml文档,我需要它在我的c:上打开一个文件夹,解析文件夹中的所有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
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)
)
)
);