从特定节点循环XML

时间:2017-01-08 10:45:20

标签: xml vb.net

我有一个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

2 个答案:

答案 0 :(得分:1)

您的问题有点令人困惑,因为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中是否存在新版本,因为新版本可能无法按顺序传递,则需要进行微小更改。

答案 1 :(得分:0)

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

首先我获取sqldiff.xml文件

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

接下来我得到Last元素(感谢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