У меня есть XML-файл с 500 000 записей, и структура выглядит следующим образом:
<files>
<file>
<fileName><![CDATA[D:\Inetpub\wwwroot\default.html]]></fileName>
<lastModified>2011-07-01 14:06:25</lastModified>
</file>
</files>
Для выбора определенной записи я использую XPathNavigator с запросом:
xpiOrg = xpnOrg.Select("/files/file[fileName='" & strFileNameCurrent & "']/lastModified")
xpiOrg, являющийся XPathNodeIterator. Моя цель - получить значение lastModified, где fileName равно переменной strFileNameCurrent, которая сама заполняется из XML-файла (500 000 записей) в цикле. Есть ли способ ускорить запрос XPath? Существуют ли более быстрые способы получения совпадающей записи из набора XML из другого?
Весь мой код выглядит так:
Dim xtrCurrent As New XmlTextReader("C:\xxx\_files.xml")
Dim xpdCurrent As New XPathDocument(xtrCurrent)
Dim xpnCurrent As XPathNavigator = xpdCurrent.CreateNavigator()
Dim xpiCurrent As XPathNodeIterator = xpnCurrent.Select("/files/file")
Dim xpiCurrentChildren As XPathNodeIterator
Dim xtrOrg As New XmlTextReader("C:\xxx\files.xml")
Dim xpdOrg As New XPathDocument(xtrOrg)
Dim xpnOrg As XPathNavigator = xpdOrg.CreateNavigator()
Dim xpiOrg As XPathNodeIterator
Dim strFileNameCurrent As String
Dim dtLastModifiedCurrent As DateTime
Dim dtLastModifiedOrg As DateTime
Dim sbNewFiles As New StringBuilder
Dim sbModifiedFiles As New StringBuilder
While xpiCurrent.MoveNext()
'get fileName and lastModified from current node
xpiCurrentChildren = xpiCurrent.Current.SelectChildren(XPathNodeType.Element)
xpiCurrentChildren.MoveNext()
strFileNameCurrent = xpiCurrentChildren.Current.Value
xpiCurrentChildren.MoveNext()
dtLastModifiedCurrent = Convert.ToDateTime(xpiCurrentChildren.Current.Value)
'did it exist in the org xml list?
xpiOrg = xpnOrg.Select("/files/file[fileName='" & strFileNameCurrent & "']/lastModified")
While xpiOrg.MoveNext()
dtLastModifiedOrg = Convert.ToDateTime(xpiOrg.Current.Value)
End While
If xpiOrg.Count = 0 Then
sbNewFiles.Append(strFileNameCurrent).Append("<br>")
Else
If dtLastModifiedCurrent > dtLastModifiedOrg Then
sbModifiedFiles.Append(strFileNameCurrent).Append("<br>")
End If
End If
End While