Анализировать несколько файлов XML с помощью ASP.NET (C #) и возвращать файлы с определенным элементом.

2

Привет.

Я ищу способ разобрать несколько XML файлов в определенном каталоге с помощью ASP.NET(С#). Я хотел бы иметь возможность возвращать контент из определенных элементов, но перед этим нужно найти те, которые имеют определенное значение между элементом.

Пример файла XML 1:

<file>
    <title>Title 1</title>
    <someContent>Content</someContent>
    <filter>filter</filter>
</file>

Пример XML файла 2:

<file>
    <title>Title 2</title>
    <someContent>Content</someContent>
    <filter>filter, different filter</filter>
</file>

Пример 1:

Дайте мне весь XML, у которого есть фильтр 'filter'.

Пример 2:

Дайте мне весь XML, который имеет заголовок "Title 1".

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

Я бы предпочел, чтобы это было сделано на стороне сервера, чтобы я мог кэшировать с этой целью.

Можно использовать функциональность из любой версии .NET Framework.

Спасибо!

~ Джеймс

Теги:

4 ответа

7
Лучший ответ

Если вы используете .Net 3.5, это очень легко с LINQ:

//get the files
XElement xe1 = XElement.Load(string_file_path_1);
XElement xe2 = XElement.Load(string_file_path_2);

//Give me all XML that has a filter of 'filter'.
var filter_elements1 = from p in xe1.Descendants("filter") select p;
var filter_elements2 = from p in xe2.Descendants("filter") select p;
var filter_elements = filter_elements1.Union(filter_elements2);

//Give me all XML that has a title of 'Title 1'.
var title1 = from p in xe1.Descendants("title") where p.Value.Equals("Title 1") select p;
var title2 = from p in xe2.Descendants("title") where p.Value.Equals("Title 1") select p;
var titles = title1.Union(title2);

Все это можно записать сокращенно и получить ваши результаты всего за 4 строки:

XElement xe1 = XElement.Load(string_file_path_1);
XElement xe2 = XElement.Load(string_file_path_2);
var _filter_elements = (from p1 in xe1.Descendants("filter") select p1).Union(from p2 in xe2.Descendants("filter") select p2);
var _titles = (from p1 in xe1.Descendants("title") where p1.Value.Equals("Title 1") select p1).Union(from p2 in xe2.Descendants("title") where p2.Value.Equals("Title 1") select p2);

Все они будут IEnumerable списками, поэтому они очень легко работать с:

foreach (var v in filter_elements)
    Response.Write("value of filter element" + v.Value + "<br />");

Правила LINQ!

2

Здесь один из способов использования Framework 2.0. Вы можете сделать этот очиститель, используя регулярные выражения, а не простой тест строки. Вы также можете попробовать скомпилировать ваши выражения XPath, если вам нужно больше сжать производительность.

static void Main(string[] args)
{
    string[] myFiles = { @"C:\temp\XMLFile1.xml", 
                         @"C:\temp\XMLFile2.xml", 
                         @"C:\temp\XMLFile3.xml" };
    foreach (string file in myFiles)
    {
        System.Xml.XPath.XPathDocument myDoc = 
            new System.Xml.XPath.XPathDocument(file);
        System.Xml.XPath.XPathNavigator myNav = 
            myDoc.CreateNavigator();

        if(myNav.SelectSingleNode("/file/filter[1]") != null &&
            myNav.SelectSingleNode("/file/filter[1]").InnerXml.Contains("filter"))
            Console.WriteLine(file + " Contains 'filter'");

        if (myNav.SelectSingleNode("/file/title[1]") != null &&
            myNav.SelectSingleNode("/file/title[1]").InnerXml.Contains("Title 1"))
            Console.WriteLine(file + " Contains 'Title 1'");
    }

    Console.ReadLine();
}
2

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

Скажем, создайте XMLContentEnumerator: IEnumerable. который будет перебирать файлы в определенном каталоге и анализировать его содержимое, а затем вы сможете сделать обычный запрос фильтрации LINQ, например:

var xc = new XMLContentEnumerator(@"C:\dir");

var filesWithHello = xc.Where(x => x.title.Contains("hello"));

У меня нет среды, чтобы предоставить полный пример, но это должно дать некоторые идеи.

1

Использовать XPath?
http://www.w3schools.com/XPath/default.asp

Ещё вопросы

Сообщество Overcoder
Наверх
Меню