Синтаксический анализ нескольких XML-файлов с использованием xmldocument c#

#c# #arrays #foreach #xml-parsing #xmldocument

#c# #массивы #foreach #xml-синтаксический анализ #xmldocument

Вопрос:

Я могу загрузить несколько xml-документов со своего диска c, но мне нужно найти способ поместить что-то в цикл, чтобы я мог анализировать все XML-файлы, а не только первый.

 using System;
using System.IO;
using System.Xml;

public class Program
{


    public static void Main()
    {

        string[] filePaths = Directory.GetFiles(@"C:Usersr626890DocumentsBoxTesting",      "*.xml");
        foreach (string files in filePaths)
        Console.WriteLine("'{0}'",files);
        Console.WriteLine();

        XmlDocument doc = new XmlDocument();
        string file = filePaths[0].ToString();
        XmlNodeList xmlnode;
        doc.Load(file);

        XmlNodeList indexValue = doc.GetElementsByTagName("Index");

        for (int i = 0; i < indexValue.Count; i  )
        {
            Console.WriteLine();
            Console.WriteLine("Description: {0} ",             indexValue[i].ChildNodes.Item(0).InnerXml);
            Console.WriteLine("Value:       {0} ", indexValue[i].ChildNodes.Item(1).InnerXml);
        //  Console.WriteLine("{0}",i);
        }

        xmlnode = doc.GetElementsByTagName("FileName");
        for (int i = 0; i < xmlnode.Count; i  )
        {
            // Console.WriteLine("URI: {0} ", elemList[i].InnerXml.Split('_')[0]);
            Console.WriteLine();
            Console.WriteLine("Type:        {0} ", xmlnode[i].InnerXml.Split('_')[1]);
            Console.WriteLine();
            Console.WriteLine("File Name:   {0} ", xmlnode[i].InnerXml);
                             Console.WriteLine("------------------------------------------------------------");
            Console.WriteLine("(Total # of files: {0})",   i);
        }



        Console.ReadLine();

    }
}
  

Ответ №1:

Вы забыли о масштабах :

 foreach (string files in filePaths)
  

И вы должны загрузить свой документ с :

 doc.Load(files);
  

Вместо

 doc.Load(file);
  

Поскольку файл ссылается на

 string file = filePaths[0].ToString();
  

Следовательно, на него ссылаются на первый элемент filePaths коллекции (первый файл).

Я предлагаю вам переименовать «files» в «file», потому что это не коллекция, это всего лишь один повторяющийся элемент вашей коллекции.

     string[] filePaths = Directory.GetFiles(@"C:Usersr626890DocumentsBoxTesting",      "*.xml");
    foreach (string file in filePaths)
    {
        Console.WriteLine("'{0}'",file);
        Console.WriteLine();

        XmlDocument doc = new XmlDocument();
        //string file = filePaths[0].ToString();
        XmlNodeList xmlnode;
        doc.Load(file);

        XmlNodeList indexValue = doc.GetElementsByTagName("Index");

        for (int i = 0; i < indexValue.Count; i  )
        {
            Console.WriteLine();
            Console.WriteLine("Description: {0} ",             indexValue[i].ChildNodes.Item(0).InnerXml);
            Console.WriteLine("Value:       {0} ", indexValue[i].ChildNodes.Item(1).InnerXml);
        //  Console.WriteLine("{0}",i);
        }

        xmlnode = doc.GetElementsByTagName("FileName");
        for (int i = 0; i < xmlnode.Count; i  )
        {
            // Console.WriteLine("URI: {0} ", elemList[i].InnerXml.Split('_')[0]);
            Console.WriteLine();
            Console.WriteLine("Type:        {0} ", xmlnode[i].InnerXml.Split('_')[1]);
            Console.WriteLine();
            Console.WriteLine("File Name:   {0} ", xmlnode[i].InnerXml);
                             Console.WriteLine("------------------------------------------------------------");
            Console.WriteLine("(Total # of files: {0})",   i);
        }

    }

    Console.ReadLine();
  

Комментарии:

1. это, безусловно, решило проблему. Имеет смысл поместить все это в цикл foreach. Еще один вопрос … как я могу вести подсчет количества отображаемых файлов?

2. Если вы хотите вести подсчет, вы должны использовать : for (int i = 0; i < Пути к файлам. длина; i ) вместо foreach и замените все переменные «file» на filePaths[i], как вы сделали: string file = filePaths[0]. toString(); но замените «0» на «i» : string file = Пути к файлам[i]. toString();, и сохраните область видимости. Надеюсь, это поможет!

3. Идеально! Ценю помощь!!

4. Нильс, сейчас я собираюсь написать XML на основе этих конкретных проанализированных элементов (тип документа, описание, значение, тип файла, имя файла). Каков наилучший подход для этого? Я хочу создать 1 большой XML-документ, а не создавать по 1 для каждого файла.