сократить время загрузки XML-файла - PullRequest
0 голосов
/ 03 марта 2010

У меня есть код ниже. Работает нормально, но загружается слишком долго, примерно 30 секунд. Могу ли я что-нибудь сделать, чтобы сократить это время?

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

Ответы [ 3 ]

1 голос
/ 03 марта 2010

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

Вопрос, рассматривали ли вы преобразование XML с помощью таблицы стилей?

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

0 голосов
/ 05 марта 2010

Попробуйте использовать объекты 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
0 голосов
/ 03 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...