2010-03-03 53 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