【问题标题】:Parse multiple XML files with ASP.NET (C#) and return those with particular element使用 ASP.NET (C#) 解析多个 XML 文件并返回具有特定元素的文件
【发布时间】:2008-09-20 12:15:01
【问题描述】:

您好。

我正在寻找一种方法来使用 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>

案例一:

给我所有具有“过滤器”过滤器的 XML。

示例案例 2:

给我所有标题为“标题 1”的 XML。

看起来,使用 LINQ 似乎应该可以做到这一点,但我只看到了有关如何在有一个 XML 文件时执行此操作的示例,而不是在有多个 XML 文件时,例如在这种情况下。

我希望这在服务器端完成,以便我可以在那端进行缓存。

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

谢谢!

~詹姆斯

【问题讨论】:

    标签: c# asp.net xml


    【解决方案1】:

    如果您使用的是 .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】:

      您可能想要创建自己的迭代器类来迭代这些文件。

      比如说,创建一个 XMLContentEnumerator : IEnumerable。它将遍历特定目录中的文件并解析其内容,然后您将能够进行正常的 LINQ 过滤查询,例如:

      var xc = new XMLContentEnumerator(@"C:\dir");
      
      var filesWithHello = xc.Where(x => x.title.Contains("hello"));
      

      我没有提供完整示例的环境,但这应该提供一些想法。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          【讨论】:

            猜你喜欢
            • 2015-08-26
            • 1970-01-01
            • 1970-01-01
            • 2020-08-10
            • 2014-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-11
            相关资源
            最近更新 更多