2015-07-10 73 views
0

下面的VB.Net代碼在移動到xml文件(sampler_01.xml)中的下一條記錄方面工作正常。如您所見,VB.Net代碼使用XPath。我遇到的問題是獲取任何邏輯與「上一個」按鈕(btnPrevious)一起工作並獲取以前的記錄。VB.Net,XPath和XMLReader - 下一個和上一個記錄

我真正想要做的是有能力移動到一個記錄旁邊或移回到先前的記錄。在這一點上,我不確定如何應用邏輯。任何建議或幫助將不勝感激。

謝謝!

編輯:請參考下面以 「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>[email protected]</ContEmail> 
     <ContPhone>(603) 555-1212</ContPhone> 
    </Company> 
    <Company Id="000002"> 
     <CompID>000002</CompID> 
     <ContFn>Ben</ContFn> 
     <ContLn>Henderson</ContLn> 
     <ContEmail>[email protected]</ContEmail> 
     <ContPhone>(603) 882-4040</ContPhone> 
    </Company> 
    <Company Id="000003"> 
     <CompID>000003</CompID> 
     <ContFn>Bob</ContFn> 
     <ContLn>James</ContLn> 
     <ContEmail>[email protected]</ContEmail> 
     <ContPhone>(603) 641-2120</ContPhone> 
    </Company> 
    <Company Id="000004"> 
     <CompID>000004</CompID> 
     <ContFn>Aaron</ContFn> 
     <ContLn>Smith</ContLn> 
     <ContEmail>[email protected]</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 
+0

你有一個特殊原因,不只是XML數據加載到某種形式的集合,只是與合作,而不是試圖對連續的XML工作? –

+0

感謝Damien的回覆。我在這些實例上加載XML的原因是爲了能夠捕獲任何更新。上面的代碼我已經分解成更簡單的格式,以便其他人可以在本地級別上進行採樣,但實際上它從遠程服務器讀取XML。但是,我真的不明白這對XML持續有效嗎? –

+0

嗨達米恩 - 順便說一下,我確實看到你的問題在哪裏,但XML文件可以達到約3 MEG。 XML Reader似乎工作得更快。如果您知道如何在不犧牲速度的情況下將其加載到集合中,請隨時指向該方向。我唯一的想法是通過序列化,但我還沒有得到那麼多,只是還沒有測試...再次,感謝您的回覆... –

回答

0

Th下面的代碼使用XML Reader可以有效地處理我需要的東西。在用Linq進行了一些測試之後(正如jdweng雄辯地提出的那樣),我發現在一些重新設計之後,XML Reader是讀取1MEG以外的更大XML文件的更好選擇。下面的代碼處理上一個和下一個控件,同時在讀取XML文件時捕獲任何更新。

「Form1.vb的2.0」

Imports System.IO 
Imports System.Xml 

Public Class Form1 

     Public dSet = New DataSet 
     Public CompRow As Integer 

     Private Sub FileLoad() 

      dSet.Clear() 

      Dim xmlFile As XmlReader 
      xmlFile = XmlReader.Create("C:\XML_Files\sampler_01.xml", New XmlReaderSettings()) 
      dSet.ReadXml(xmlFile) 

      CompRow = 0 
      ShowData(CompRow) 

      xmlFile.Close() 

     End Sub 

     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

      FileLoad() 

     End Sub 

     Private Sub btnReLoad_Click(sender As System.Object, e As System.EventArgs) Handles btnReLoad.Click 

      FileLoad() 

     End Sub 

     Private Sub ShowData(ByVal CurrentRow) 

      txtCompID.Text = dSet.Tables("Company").Rows(CompRow)("CompID").ToString 
      txtContFn.Text = dSet.Tables("Company").Rows(CompRow)("ContFn").ToString 
      txtContLn.Text = dSet.Tables("Company").Rows(CompRow)("ContLn").ToString 
      txtContEmail.Text = dSet.Tables("Company").Rows(CompRow)("ContEmail").ToString 
      txtContPhone.Text = dSet.Tables("Company").Rows(CompRow)("ContPhone").ToString 

     End Sub 

     Private Sub btnNext_Click(sender As System.Object, e As System.EventArgs) Handles btnNext.Click 

      If CompRow <> dSet.Tables("Company").Rows.Count - 1 Then 
       CompRow += 1 
       ShowData(CompRow) 
      Else 
       MsgBox("Last Record is Reached!!!") 
      End If 

     End Sub 

     Private Sub btnPrevious_Click(sender As System.Object, e As System.EventArgs) Handles btnPrevious.Click 

      If CompRow <> 0 Then 
       CompRow -= 1 
       ShowData(CompRow) 
      Else 
       MsgBox("First Record is Reached!!!") 
      End If 

     End Sub 
End Class 
0

使用XML我更新的答案linq

Imports System.Xml 
Imports System.Xml.Linq 
Public Class Form1 

    Const FILENAME As String = "c:\temp\test.xml" 

    Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Dim doc As XDocument = XDocument.Load(FILENAME) 

     Dim companies = doc.Descendants("Company").ToList() 

     Dim companyPointer = companies.First() 

     Dim index As Integer = 0 
     companyPointer = companies(index + 1) 
     index = index + 1 


    End Sub 

End Class 
​ 
+0

嗨jdweng,謝謝你的回覆。稍後我會看看這個,看看我可以如何實現。 –

+0

嗨jdweng,謝謝你的建議!我能夠看看Linq,並且在比較大型XML文件時,我發現XML閱讀器是我所需要的更好的選擇。再次,非常感謝您抽出時間回覆!最好! –

+0

你的意思是反序列化xml到類中?或者一次只讀一家公司?對於巨大的XML,建議使用XML閱讀器以獲得最佳性能。如果你要多次搜索xml,那麼最好將整個xml讀入類(反序列化)或者像Virtual Storm建議的那樣寫入數據表。我喜歡數據表格方法並經常使用它。在一條指令中,您可以讀取整個文件。然後使用datatable上的Linq執行查詢。 – jdweng