2011-04-21 73 views
1

我正在为ASP.NET网站编写一个进程,该网站将从XML文件中查找某个值并执行重定向。我正在使用LINQ(C#)来解析这个XML。使用LINQ to XML解析更小的XML多次或更大的XML

我已经达到了决定点,我必须在同一个请求中查找替代值。我有两种解决方案:

  1. 分别查找每个值。这将意味着解析XML两次。但是XML大小将会小得多

  2. 将多个值存储在XML中并解析XML一次。这将使XML更大。

那么对于具有一定并发性的网站来说,哪种方法的性能开销更少?

简单地说,我应该解析200个元素一次或100个元素两次?

+0

顺便说一句,XML字符串已经缓存在Cache对象中。 – dotnetster 2011-04-21 19:22:50

+0

向我们展示linq查询。我会告诉你如何缓存完整的结果集,而不是XML字符串:) – sehe 2011-04-21 20:58:28

+0

我无法缓存结果集,因为它可能是不同的请求。其实我缓存XElement本身。 – dotnetster 2011-04-21 21:23:44

回答

0

好吧,我通过我的Linq查询获取了两个场景的结果,然后遍历这两个XElements来确定我需要使用哪一个。我只需要多思考一下。所以,现在,我有一个更小的XML和一个查询。

 IEnumerable<XElement> mping = (from mpings in mpingXML.Elements("mping") 
              where mpings.Element("sptrn").Value.Equals(sourceURL, StringComparison.InvariantCultureIgnoreCase) 
              && (mpings.Attribute("lcl").Value.Equals(locale, StringComparison.InvariantCultureIgnoreCase) || mpings.Attribute("lcl").Value.Equals("ALL", StringComparison.InvariantCultureIgnoreCase)) 
              select mpings); 
2

都没有。缓存解析结果直到它被更改(如果曾经)。

+0

我正在缓存整个XML。但是,解析Linq查询的结果是不可能的,因为每个请求都会产生可能不同的结果集。 – dotnetster 2011-04-21 19:19:02

+0

那么你的应用程序需要做些什么。如果LINQ to XML不够好,只需将XML表示中的数据加载到更好的数据结构中即可。你没有展示结构,所以很难推荐更具体的东西。 – 2011-04-22 07:35:51

1

为什么不把它解析成内存一次然后在内存中查找?例如。将它读入您的Application对象的Dictionary <>。将文件系统监视器放在文件上并重新解析,如果它改变了。

+0

XML已经在内存中。我正试图进一步优化。因此,我的问题与两个查找大小。 – dotnetster 2011-04-21 19:17:32

0

我的$ 0.02:

缓存的XElement(和反复查询)是不够好,直到你的分析器告诉你,否则。

+0

我同意。 XML现在只有大约40-50 KB。 – dotnetster 2011-04-22 14:08:19