使用ASP.NET(C#)解析多个XML文件,并返回包含特定元素的文件
你好 我正在寻找一种方法,用ASP.NET(C#)解析特定目录中的大量XML文件。我希望能够从特定元素返回内容,但在此之前,需要找到元素之间具有特定值的内容 示例XML文件1:使用ASP.NET(C#)解析多个XML文件,并返回包含特定元素的文件,c#,asp.net,xml,C#,Asp.net,Xml,你好 我正在寻找一种方法,用ASP.NET(C#)解析特定目录中的大量XML文件。我希望能够从特定元素返回内容,但在此之前,需要找到元素之间具有特定值的内容 示例XML文件1: <file> <title>Title 1</title> <someContent>Content</someContent> <filter>filter</filter> </file> 标题
<file>
<title>Title 1</title>
<someContent>Content</someContent>
<filter>filter</filter>
</file>
标题1
内容
滤波器
示例XML文件2:
<file>
<title>Title 2</title>
<someContent>Content</someContent>
<filter>filter, different filter</filter>
</file>
标题2
内容
过滤器,不同的过滤器
示例案例1:
给我一个过滤器为'filter'的所有XML
示例案例2:
给我所有标题为“title 1”的XML
看起来,使用LINQ应该可以做到这一点,但我只看到了当有一个XML文件时如何做到这一点的示例,而不是当有多个XML文件时,例如在本例中
我更希望这是在服务器端完成的,这样我就可以在服务器端缓存
可以使用任何版本的.NET Framework的功能
谢谢
~James使用XPath?您可能希望创建自己的迭代器类来迭代这些文件 比如说,创建一个XMLContentEnumerator:IEnumerable。这将迭代特定目录中的文件并解析其内容,然后您将能够进行正常的LINQ过滤查询,例如:
var xc = new XMLContentEnumerator(@"C:\dir");
var filesWithHello = xc.Where(x => x.title.Contains("hello"));
我没有提供完整示例的环境,但这应该会给出一些想法。如果您使用的是.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 />");
foreach(过滤器元件中的var v)
响应。写入(“滤芯值”+v.值+”
);
LINQ规则 这里有一种使用Framework2.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();
}