Linq to XML анализирует файлы в папке - PullRequest
1 голос
/ 08 сентября 2011

Итак, у меня есть это построение кода без ошибок, но мне нужно изменить способ открытия документов 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");
}

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

Вы должны пройти через Directory.EnumerateFiles(@"C:\Something", "*.xml").

0 голосов
/ 08 сентября 2011

Вместо того, чтобы просто записывать значения в консоль, вы можете создать новый Xml-документ из значений в файлах и делать с ним все, что хотите (создать электронную таблицу Excel?):

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)
         )
      )
    );

Конечно, так как это полный декларативный и один длинный оператор, отладка в случае необходимости - это хитрость.

0 голосов
/ 08 сентября 2011

... Немного более "декларативно":

// 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...