【发布时间】:2015-07-10 04:25:20
【问题描述】:
下面的 VB.Net 代码可以很好地移动到 xml 文件 (sampler_01.xml) 中的下一条记录。如您所见,VB.Net 代码使用 XPath。我遇到的问题是让任何逻辑都可以使用“上一个”按钮 (btnPrevious) 并获取上一个记录。
我真正想做的是能够移到一条记录旁边或移回上一条记录。在这一点上,我不确定需要如何应用逻辑。任何建议或帮助将不胜感激。
谢谢!
编辑:请在下面使用“Form1.vb 2.0”查看我的更新答案
“sampler_01.xml”
<?xml version="1.0" encoding="UTF-8"?>
<Companies>
<Company Id="000001">
<CompID>000001</CompID>
<ContFn>Jerry</ContFn>
<ContLn>McGuire</ContLn>
<ContEmail>jerrym@email.com</ContEmail>
<ContPhone>(603) 555-1212</ContPhone>
</Company>
<Company Id="000002">
<CompID>000002</CompID>
<ContFn>Ben</ContFn>
<ContLn>Henderson</ContLn>
<ContEmail>benh@email.com</ContEmail>
<ContPhone>(603) 882-4040</ContPhone>
</Company>
<Company Id="000003">
<CompID>000003</CompID>
<ContFn>Bob</ContFn>
<ContLn>James</ContLn>
<ContEmail>bobj@email.com</ContEmail>
<ContPhone>(603) 641-2120</ContPhone>
</Company>
<Company Id="000004">
<CompID>000004</CompID>
<ContFn>Aaron</ContFn>
<ContLn>Smith</ContLn>
<ContEmail>arrons@email.com</ContEmail>
<ContPhone>(603) 968-1212</ContPhone>
</Company>
</Companies>
“Form1.vb 1.0”
Imports System.Net
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Public Class Form1
Dim xpd As XPathDocument
Dim xpn As XPathNavigator
Dim xpn1, xpn2, xpn3, xpn4, xpn5 As XPathNodeIterator
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
LoadXmlToRead()
End Sub
Private Sub ListToTextBoxes()
txtCompID.Text = xpn1.Current.Value
txtContFn.Text = xpn2.Current.Value
txtContLn.Text = xpn3.Current.Value
txtContEmail.Text = xpn4.Current.Value
txtContPhone.Text = xpn5.Current.Value
End Sub
Private Sub LoadXmlToRead()
xpd = New XPathDocument("C:\XML_Files\sampler_01.xml")
xpn = xpd.CreateNavigator()
xpn1 = xpn.Select("/Companies/Company/CompID")
xpn2 = xpn.Select("/Companies/Company/ContFn")
xpn3 = xpn.Select("/Companies/Company/ContLn")
xpn4 = xpn.Select("/Companies/Company/ContEmail")
xpn5 = xpn.Select("/Companies/Company/ContPhone")
End Sub
Private Sub btnNext_Click(sender As System.Object, e As System.EventArgs) Handles btnNext.Click
If xpn1.MoveNext() Or _
xpn2.MoveNext() Or _
xpn3.MoveNext() Or _
xpn4.MoveNext() Or _
xpn5.MoveNext() Then
ListToTextBoxes()
Else
MsgBox("End of contacts has been reached...")
LoadXmlToRead()
End If
End Sub
Private Sub btnLoad_Click(sender As System.Object, e As System.EventArgs)Handles btnLoad.Click
LoadXmlToRead()
If txtCompID.Text = "" And _
txtContFn.Text = "" And _
txtContLn.Text = "" And _
txtContLn.Text = "" And _
txtContPhone.Text = "" Then
xpn1.MoveNext()
xpn2.MoveNext()
xpn3.MoveNext()
xpn4.MoveNext()
xpn5.MoveNext()
ListToTextBoxes()
MsgBox("The Contact database has been loaded")
End If
End Sub
Private Sub btnPrevious_Click(sender As System.Object, e As System.EventArgs) Handles btnPrevious.Click
If xpn1.Current.MoveToPrevious() Or _
xpn2.Current.MoveToPrevious() Or _
xpn3.Current.MoveToPrevious() Or _
xpn4.Current.MoveToPrevious() Or _
xpn5.Current.MoveToPrevious() Then
ListToTextBoxes()
End If
End Sub
End Class
【问题讨论】:
-
您是否有特定的理由不只是将 XML 数据加载到某种形式的集合中并直接使用它,而不是尝试连续处理 XML?
-
感谢达米安的回复。我在这些实例上加载 XML 的原因是我可以捕获任何更新。上面的代码我已经分解成更简单的格式,以便其他人可以在本地级别进行采样,但它实际上是从远程服务器读取 XML。但是,我真的看不出它是如何持续对 XML 起作用的?
-
您好 Damien - 顺便说一下,我确实知道您的问题所在,但 XML 文件最多可以达到 3 MEG。 XML Reader 似乎工作得更快。如果您知道在不牺牲速度的情况下将其加载到集合中的方法,请随时指出我的方向。我唯一的其他想法是通过序列化,但我还没有到那一步来测试......再次感谢您的回复......
-
嗨,Damien,感谢您的意见,因为这鼓励我更加努力地研究 XMLReader...我找到了我正在寻找的...最好的!