2010-03-03 3 views
0

У меня есть код ниже. Он отлично работает, но загрузка занимает слишком много времени, примерно 30 секунд. Есть ли что-то, что я могу сделать, чтобы сократить это время.shorten xml время загрузки файла

Кроме того, я хотел бы найти файл xml для документов с NAME, начиная с 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, которые я получаю, поступают из веб-службы, которую я потребляю. Есть ли что-нибудь, что я могу сделать, чтобы оптимизировать эту производительность? Большое спасибо

+1

Если это так, как вы собираетесь конвертировать XML, вы должны использовать надлежащим образом предварительно размера 'StringBuilder' вместо' String' выполнять все эти конкатенации. –

+0

Сколько времени требуется, чтобы получить файл из веб-службы? Если для получения файла требуется 29 секунд, а затем 1 секунда для выполнения этого кода, проблема не в коде. Кроме того, если вы можете запустить этот код с локальной копией файла за 1 секунду, и вы можете получить файл с сервера через пару секунд, тогда сначала скопируйте файл локально, затем проанализируйте локальную копию. – xcud

ответ

0

Что касается вопроса о производительности, профайл вашего кода, чтобы узнать, где он проводит большую часть своего времени, а затем работать с этим. StringBuilder вместо конкатенации строк уже упоминался.

Что касается вашего второго вопроса «Я хотел бы найти файл xml для документов с именем NAME, начинающимся с A, B, C» Я не уверен, что вы спрашиваете, как «xml-файл» обычно не содержит «документов» " искать.

Возможно, у вас есть элементы с именем 'document' в вашем XML-документе и вы хотите искать те, которые начинаются с, например. «А»; в этом случае запуск XPath с помощью функции помогает, например, //document[starts-with(., 'A')] выбирает все элементы с именем 'document', где содержимое строки начинается с 'A'.

+0

Большое спасибо за помощь. Я добавил StringBuilder вместо конкатенаций строк, которые у меня были раньше. Производительность, однако, не изменилась. Я забыл упомянуть в своем сообщении, что XML-файл, который я использую, я получаю через веб-службу. Будет ли это проблемой? Как я могу это оптимизировать? Большое спасибо – netNewbi3

1

Вы должны использовать StringBuilder. Задайте начальную емкость объекта StringBuilder для соответствующего значения.

Вопрос: Вы считали преобразование XML в таблицу стилей?

Обратите внимание, что оператор & позволяет объединять различные типы данных в строки. Поэтому ваш код выполняет дополнительную неявную работу для преобразования различных объектов в строки. Тем не менее, как только вы используете StringBuilder, вы устраните необходимость использования этих операторов.

0

Попробуйте использовать объекты XPathExpression для других вызовов SelectSingleNode. Сделайте эти объекты до начала цикла. Выражение действительно для всего документа. Вам не нужно воссоздавать их для каждого элемента. Извините, но я должен был заметить это раньше. Это определенно поможет.

Как только это будет сделано, вы можете захотеть время фактического вызова веб-службы с помощью объекта StopWatch. Затем время обработки 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 
Смежные вопросы