簡體   English   中英

使用ASP.NET(C#)解析多個XML文件並返回具有特定元素的XML文件

[英]Parse multiple XML files with ASP.NET (C#) and return those with particular element

問候。

我正在尋找一種方法,用ASP.NET(C#)解析特定目錄中的大量XML文件。 我希望能夠從特定元素返回內容,但在此之前,需要找到元素之間具有特定值的內容。

示例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。

案例2:

給我所有標題為“Title 1”的XML。

看起來,這似乎應該可以用LINQ,但我只看到有關如何在有一個XML文件時執行此操作的示例,而不是在存在多個時,例如在這種情況下。

我希望這可以在服務器端完成,這樣我就可以在那一端緩存。

可以使用任何版本的.NET Framework的功能。

謝謝!

〜詹姆斯

如果您使用的是.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規則!

您可能希望創建自己的迭代器類來迭代這些文件。

比如說,制作一個XMLContentEnumerator:IEnumerable。 這將迭代特定目錄中的文件並解析其內容,然后您將能夠進行正常的LINQ過濾查詢,例如:

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

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

我沒有提供完整示例的環境,但這應該提供一些想法。

這是使用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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM