#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 для каждого файла.