2010-03-03 78 views
0

我有以下代码。它工作正常,但加载需要很长时间,大约30秒。有什么我可以做的,以缩短这一次。缩短xml文件加载时间

另外,我想搜索的XML文件与名称以A,B,C ETX文件。我怎么做?

非常感谢,

Dim xdoc As New XPathDocument(xt) 
    Dim nav As XPathNavigator = xdoc.CreateNavigator() 
    Dim expr As XPathExpression 
    expr = nav.Compile("/pf:CONTRACTS/pf:CONTRACT") 

Dim namespaceManager As XmlNamespaceManager = New XmlNamespaceManager(nav.NameTable) 
namespaceManager.AddNamespace("pf", "http://namespace/") 

expr.SetContext(namespaceManager) 

Dim nodes As XPathNodeIterator = nav.Select(expr) 

If nodes.Count <> 0 Then 

Dim tr As String = Nothing 

For Each node As XPathNavigator In nodes 

    tr += "<td><a Target='_blank' href='http://www.urltosite.aspx?contract=" & node.SelectSingleNode("pf:ID", namespaceManager).Value & "'>" & node.SelectSingleNode("pf:NAME", namespaceManager).Value & "</a></td>" 

    For Each subNode2 As XPathNavigator In node.Select("pf:SUPPLIERS/pf:SUPPLIER", namespaceManager) 

tr += "<td>" & subNode2.SelectSingleNode("pf:SUPPLIERNAME", namespaceManager).Value & "</td>" 

    Next 

    tr += "<td>" & node.SelectSingleNode("pf:ENDDATE", namespaceManager).Value & "</td>" 

tr += "</tr>" 

Next 

Dim th As String = "<th width='50%'>Name</th><th width='30%'>Supplier</th><th width='20%'>End Date</th>" 

div1.InnerHtml = ("<table width='96%' border='0' cellpadding='0' cellspacing='0' border='0' class='datatable1'>" & th) + tr & "</table>" 

Else 

div1.InnerHtml = "No results for your search" 

End If 

++ UPDATE ++

感谢您的帮助

我添加了一个StringBuilder我的代码,而不是字符串连接。但是,性能并没有改变,所以我认为这个问题在别的地方。

我忘了我以前的XML数据我收到来自Web服务我耗费电子邮件提。有什么我可以做的,以优化这种表现? 非常感谢

+1

如果这是你要你的XML转换的方式,你应该使用预先适当大小的'StringBuilder'代替'String'来执行所有这些并置。 – 2010-03-03 17:47:24

+0

从Web服务获取文件需要多长时间?如果需要29秒才能获得文件,那么需要1秒来执行此代码,那么问题不在于代码。此外,如果您可以在1秒内针对本地文件副本运行此代码,并且您可以在几秒钟内从服务器获取文件,那么先复制本地文件,然后解析本地副本。 – xcud 2010-03-04 21:53:43

回答

0

至于性能问题,分析代码,找出它花费大量的时间,然后从工作。已经提到了StringBuilder而不是字符串连接。

至于你的第二个问题“我想搜索xml文件中名称以A,B,C开头的文档”我不确定你所要求的“xml文件”通常不包含“文档“寻找。

也许您在XML文档中有名为'document'的元素,并且想要搜索那些以例如“ '一个';在这种情况下,XPath开始 - 具有帮助例如//document[starts-with(., 'A')]选择字符串内容以'A'开头的所有名为'document'的元素。

+0

非常感谢您的帮助。我添加了一个StringBuilder,而不是之前的字符串连接。但是表演并没有改变。我忘了在我的文章中提到我使用的xml文件,我通过一个Web服务获取它。那会是问题吗?我怎么能优化这个?非常感谢 – netNewbi3 2010-03-04 14:27:35

1

您必须使用StringBuilder。将StringBuilder对象的初始容量设置为适当的值。

问题,你有没有考虑用样式表转换XML?

注意,&运营商允许你不同的数据类型连接成字符串。因此,您的代码正在执行额外的隐式工作以将不同的对象转换为字符串。然而,一旦你使用了StringBuilder,你将不再需要使用这些运算符。

0

尝试为其他SelectSingleNode调用使用XPathExpression对象。在循环开始之前执行这些对象。表达式对整个文档有效。您不必为每个元素重新创建它们。 对不起,但我应该注意到这一点。这一定会有所帮助。

一旦做到这一点,你可能会想不想来一次使用秒表对象的Web服务的实际调用。然后等待你的Xml处理。

我不知道该数据集有多大或你的情况,但使用XslCompiledTransform用样式表可在关于性能更好的解决方案。 (如果需要,您可以将XslCompiledTransform存储为应用程序对象。)(您可以将样式表作为资源存储,但作为单独的文件,您可以根据需要进行编辑而无需重新编译。)它还可以简化维护工作,因为您只需需要更改样式表而不是代码。以下是我的“标准”方法调用输出Xml数据为Html。

Public Function GatherSummaryPage() As String 
    'GatherXmlData (below) returns the XML Data. 
    'GatherXsltDocument (below) gets the Xslt stylesheet from resources 

    Dim sPage As String 
    Dim oResultingXml As New System.IO.StringWriter 
    Dim oXslWriter As New System.Xml.XmlTextWriter(oResultingXml) 

    Dim oXML As New System.Xml.XmlDocument 
    Dim oXSL As New System.Xml.Xsl.XslCompiledTransform 

    oXML.LoadXml(GatherXmlData) 
    oXSL.Load(New System.Xml.XmlTextReader(New System.IO.StringReader(GatherXsltDocument)), Nothing, Nothing) 

    oXSL.Transform(oXML, oXslWriter) 

    sPage = oResultingXml.ToString 

    oResultingXml.Close() 

    GatherSummaryPage = sPage 

End Function