XML-файлы с C # - PullRequest
       17

XML-файлы с C #

0 голосов
/ 04 декабря 2009

Я хочу создать проект, в котором будет обрабатываться более одного XML-файла одновременно. В этом проекте я пытался поместить XML-файлы в массив, а затем использовал, но всегда получаю ошибки. Мой код такой:

    string[] files = { "ilk.xml", "migr.xml", "caa.xml" };
     public Form1()
    {
        InitializeComponent();

        System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"c:\markets\");
        count = dir.GetFiles("*.xml").Length;

        for (int d = 0; d < count; d++)
        {

            XmlDocument xmlDoc1 = new XmlDocument();

            xmlDoc1.Load(files[d]);

            xmldocument= new XmlDocument();

            xmldocument.Load(@"C:\\markets\files[d]");

// здесь я сравниваю значения xml файлов

                     }

ошибка: «Не удалось найти файл« C: \ markets \ files [d] ». Все XML-файлы находятся в каталоге рынков. Когда я пишу имя файла без использования массива, проблем нет. Можете ли вы помочь?» мне

Ответы [ 3 ]

10 голосов
/ 04 декабря 2009

Вы помещаете ссылку на массив в саму строку вместо ее конкатенации.

xmldocument.Load(@"C:\markets\" + files[d]);
0 голосов
/ 04 декабря 2009

Вы можете использовать асинхронную загрузку и многопоточность, если вы действительно хотите загрузить их «сразу» (например, параллельно, одновременно). Возможно, хотя вы хотите, чтобы все документы XML анализировались и загружались одновременно на основе вашего комментария, что вы будете сравнивать их. Как насчет использования массива объектов XmlDocument для сопоставления входного массива имен файлов? Это самый простой способ загрузить их все. Вы также можете использовать коллекцию, если вы хотите, чтобы она была динамичной.

public void CompareXMLInDir(string path)
{
    DirectoryInfo dir = new DirectoryInfo(path);
    CompareXML(dir.GetFiles("*.xml"));
}

public void CompareXML(FileInfo[] xmlFileNames)
{
    XmlDocument[] xmlDocuments = new XmlDocument[xmlFileNames.Length];
    for(int i = 0; i < xmlFileNames.Length; i++)
    {
        xmlDocuments[i] = new XmlDocument();
        xmlDocuments[i].Load(xmlFileNames[i].FullName);
    }

    //...do compare work here
}

Этот код также позволяет вам получить все файлы с расширением ".xml" в каталоге. Это похоже на то, что вы пытаетесь сделать со счетчиком, но затем вы ссылаетесь на статически определенный массив имен файлов. Это приведет к ошибке, если число файлов XML в этом каталоге превысит имена файлов в вашем массиве.

Если вы хотите просто использовать фиксированный набор имен, то вы можете сделать это:

public void CompareMyXMLFiles()
{
    string[] files = { "ilk.xml", "migr.xml", "caa.xml" };
    CompareXML(@"c:\markets", files);
}

public void CompareXML(string basePath, string[] xmlFileNames)
{
    XmlDocument[] xmlDocuments = new XmlDocument[xmlFileNames.Length];
    for(int i = 0; i < xmlFileNames.Length; i++)
    {
        xmlDocuments[i] = new XmlDocument();
        xmlDocuments[i].Load(basePath + @"\" + xmlFileNames[i]);
    }

    //...do compare work here
}
0 голосов
/ 04 декабря 2009

Вы упоминаете обработку нескольких файлов одновременно.

Приведенный выше код не достигнет этого, вы захотите посмотреть на многопоточность; вам нужно будет переместить обработку файлов в отдельную функцию, а затем создать экземпляр ThreadStart и Thread для активации вашей работы. Затем вам потребуется некоторая логика для списка каталогов и файлов, из которых он читает, чтобы вызвать функцию в отдельном потоке, в зависимости от количества одновременных процессов, которые вы хотите запустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...