我在手机上有一个应用程序,它需要大约50页的XML,每个XML大约有100个点头。所以,如果你进行大约5000个节点的数学运算,我正在解析。有时这些节点的设置不一样。示例:可能75%的模式与其他25%的模式不同,因此有代码可以处理它并以不同方式解析它们。
我不能再优化http调用了,因为Web服务一次只提供数据100“项目”,所以我必须基本上点击Web服务50次以获取所有数据页面。这是高级流程。
Call web service (webclient) Parse XML (take note total pages in xml. it will say Page 1 of 100) Add results to collection Call web service again for page 2 Parse Add results to collection ....rinse and repeat 100 times.
解析代码实际上是我可以优化的唯一地方。我所做的就是使用linq来解析XML并将IEnumerable中的节点分开,然后我解析它们并将它们放在我创建的自定义对象中。我正在寻找关于如何优化整个过程的一些高级想法。也许我错过了什么。
一些代码....想象下面的内容,就像1000次或更多,并且有更多属性,这是一个小例子。大多数都有30个需要解析的属性。我也无法访问真正的模式,也无法控制模式更改。
XElement eventData = XElement.Parse(e.Result);
IEnumerable<XElement> feed =
(eventData.Element("results").Elements("event").Select(el => el)).Distinct();
foreach (XElement el in feed)
{
_brokenItem = el.ToString();
thisFeeditem.InternalGuid = Guid.NewGuid().ToString();
thisFeeditem.ServiceIcon = GetServiceIcon(thisFeeditem.ServiceType);
thisFeeditem.Description = el.Attribute("displayName").Value;
thisFeeditem.EventURL = el.Attribute("uri").Value;
thisFeeditem.Guid = el.Attribute("id").Value;
thisFeeditem.Latitude = el.Element("venue").Attribute("lat").Value;
thisFeeditem.Longitude = el.Element("venue").Attribute("lng").Value;
}
答案 0 :(得分:2)
如果没有看到您的代码,那么优化它并不容易。但是,您应该考虑以下一点:
Linq-to-XML是一个基于DOM的解析器,它将整个XML文档读入驻留在内存中的模型。所有查询都是针对DOM执行的。对于大型文档,构造DOM可能是内存和CPU密集型的。此外,如果写入效率低下,则Linq-to-XML查询可以多次导航相同的树节点。
作为替代方案,请考虑使用类似XmlReader的串行解析器。这种类型的解析器不会创建基于内存的文档模型,并且只以向前的方式操作,迫使您只读取一次元素。
答案 1 :(得分:0)
您可以更改架构。
创建一个Web服务,用于收集和过滤XML数据,并在手机上检索该Web服务中的数据。
通过这种方式,您可以将繁重的处理移动到(可扩展的?!)服务器,只需在XML源更改时修改服务,而不必更新所有客户端。
您还可以缓存结果并防止重复。
现在您可以完全控制手机上发生的事情了。