XPath XPathNavigator.Select () запрос не работает хорошо в большом цикле - PullRequest
1 голос
/ 06 октября 2011

У меня есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...