从特定节点循环 XML



>我有一个XML文件,比如

<?xml version="1.0" encoding="UTF-8"?>
<sqldiff version="1.0">
    <diff>
        <version>1.0.0</version>
        <sql>
            CODE HERE
        </sql>
    </diff>
    <diff>
        <version>1.0.1</version>
        <sql>
            CODE HERE
        </sql>
    </diff>
</sqldiff>

我正在存储已执行的最后一个差异的版本(在本例中为 1.0.1)。我不想在每次应用程序运行时遍历整个 XML 文件,而只是检查是否有任何新的差异(在这种情况下,我可以从最后一个差异中获取版本)。

我的问题是,我不想遍历整个XML来比较版本,知道要跳过哪些版本以及执行哪些版本。

目前,我正在遍历所有差异并比较版本,直到它获得更新的版本,它执行该版本,然后存储上次执行的差异。这是我的代码:

        Dim BaseVersion = New Version(GetLastVersion()) 'Eg. returns 1.0.2
        Dim xmlDoc As New XmlDocument()
        xmlDoc.Load("D:sqldiff.xml")
        Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/sqldiff/diff")
        Dim pID As String = "", pCode As String = ""
        For Each node As XmlNode In nodes
            pID = node.SelectSingleNode("version").InnerText
            pCode = node.SelectSingleNode("sql").InnerText
            'Checks if pID>BaseVersion Then Executes code and store current pID
            'Else Continue
        Next

你的问题有点令人困惑,因为 xml 似乎与提供的代码不匹配,即代码中对Product_name的引用。

至于获取最后一个版本节点并检查新版本,那么这样的事情应该可以工作,

Public Function NewDiff(newVers As String) As String
    'Dim yourpath As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    'yourpath = IO.Path.Combine(yourpath, "test.xml")
    Dim xe As XElement
    ' to load from a file
    'xe = XElement.Load(yourpath)
    ' for testing
    xe = <sqldiff version="1.0">
             <diff>
                 <version>1.0.0</version>
                 <sql>
                     <!-- CODE HERE -->
                     foo
                 </sql>
             </diff>
             <diff>
                 <version>1.0.1</version>
                 <sql>
                     <!-- CODE HERE -->
                     bar
                 </sql>
             </diff>
         </sqldiff>
    Dim rv As String = Nothing
    Dim lastVersEL As XElement = xe...<version>.LastOrDefault
    If lastVersEL.Value <> newVers Then
        'get the sql nodes value for the selected version
        rv = lastVersEL.Parent.<sql>.Value.Trim
        Stop
    End If
    ' to save file
    ' xe.Save(yourpath)
    Return rv
End Function

像这样测试

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim s As String = NewDiff("1.0.2")
End Sub

如果您需要检查 xml 中是否存在新版本,因为新版本可能无法按顺序传递,则需要进行细微更改。

在寻找一段时间后,没有找到任何与我正在寻找的解决方案类似的解决方案,我尝试了几种方法,最终让它工作。dbasnett的这个解决方案有助于我解决这个问题。

首先我得到 sqldiff.xml 文件

Dim xe As System.Xml.Linq.XElement
xe = XElement.Load(IO.Path.Combine(yourpath, "sqldiff.xml"))

接下来我得到最后一个元素(感谢 dbasnett)

Dim lastVersEL As XElement = xe...<version>.LastOrDefault

最后,我使用lastVersEL并将其与原始问题中的baseVersion进行比较,如果lastVersEL更大,则表示添加了新的差异,并且我使用以下代码来获取通过版本的XElement

Dim lastExecutedEL As XElement = (From c In xe...<version> Where c.Value = baseVersion Select c).SingleOrDefault()

并获取索引(我一直在寻找的解决方案)

Dim index As Integer = xe...<version>.Nodes.ToArray.ToList.IndexOf(lastExecutedEL.FirstNode)

然后我继续按照下面的代码循环并执行差异

       If lastVersEL > baseVersion Then
           Dim lastExecutedEL As XElement = (From c In xe...<version> Where c.Value = baseVersion Select c).SingleOrDefault()
           Dim index As Integer = xe...<version>.Nodes.ToArray.ToList.IndexOf(lastExecutedEL.FirstNode)
           For i As Integer = index To xe...<version>.Nodes.Count
             'Executes the SQL stored in the Elements by gettings the value as below
             'elements(i).Parent.<sql>.Value.Trim
           Next
        End If

最新更新