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