2013-03-28 87 views
3

我對編程世界頗爲陌生(我是一個網絡人)。然而,我被要求開發一個爲控制檯應用程序配置xml文件的前端。控制檯應用程序從此xml文件讀取並打開瀏覽器的多個實例,每個監視器一個實例(總共6個監視器)。有4個控制中心,每個控制中心有6個監視器。每個控制中心運行一臺獨立的電腦。這些電腦不在網絡上,並且無法訪問彼此。我被告知我也不能使用數據庫。用VB.Net讀取和寫入一個xml文件

每臺顯示器將一次顯示一個網站,可能會列出多個網站以顯示在特定的顯示器上,以便它們會定期更改。每個控制中心將顯示不同的站點。

我的第一個問題:這個XML有效嗎?

<ControlCenter> 
    <Monitor> 
     <monitor_id>0</monitor_id> 
     <browser_short_na>ie</browser_short_na> 
    <url_list> 
    <url> 
    <url_id>0</url_id> 
    <url_na><![CDATA[http://www.hmv.com]]></url_na> 
     <parameter><![CDATA[]]></parameter> 
    </url> 
    <url> 
    <url_id>1</url_id> 
    <url_na><![CDATA[http://www.amazon.com]]></url_na> 
     <parameter><![CDATA[]]></parameter> 
    </url> 
    <url> 
    <url_id>2</url_id> 
    <url_na><![CDATA[http://www.google.com]]></url_na> 
     <parameter><![CDATA[]]></parameter> 
    </url> 
</url_list> 
    </Monitor> 
    <Monitor> 
    <monitor_id>1</monitor_id> 
    <browser_short_na>ie</browser_short_na> 
    <url_list> 
    <url> 
      <url_id>0</url_id> 
      <url_na><![CDATA[http://www.amazon.com]]></url_na> 
      <parameter><![CDATA[]]></parameter> 
    </url> 
    </url_list> 
    </Monitor> 
</ControlCenter> 

我所到目前爲止打開XML文件和所有的監視器添加到組合框

Dim dom As New Xml.XmlDocument 
    dom.Load("test.xml") 
    ComboBox1.Items.Clear() 
    Dim monitorid As String = String.Empty 
    For Each node As Xml.XmlNode In dom.SelectNodes("//ControlCenter/Monitor/monitor_id") 
     monitorid = node.InnerText 
     ComboBox1.Items.Add(monitorid) 
    Next 

現在這是我在哪裏卡住了。一旦用戶從組合框中選擇了其中一個監視器,我就需要獲取該監視器的所有信息。所以我需要browser_short_na,並且所有的url都基於monitor_id選擇。

我已經嘗試創建一個數據集,使用readxml加載xmlfile。然後我嘗試創建一個指向該數據集的數據視圖。試圖添加RowFilter到數據視圖。

Dim val As String = ComboBox1.SelectedItem.ToString 

    Dim dsXmlFile As New DataSet 
    dsXmlFile.ReadXml("test.xml") 

Dim dv As New DataView 
    dv.Table = dsXmlFile.Tables(0) 

    Dim drv As DataRowView 
    dv.RowFilter = "monitor_id = " & val 

Dim url As String = "" 
    'Retrieve my values returned in the result 
    For Each drv In dv 
     url = drv("url_na") 
    Next 

當我通過代碼,並期待在每個它失敗消息循環「url_na既不是一個DataColumn也不爲表監視器一個DataRelation」。

我想我沒有正確處理url_list部分。

一旦所選監視器的所有信息都被讀取,我將在文本框/列表框中顯示用戶可以編輯的值。如果他們然後保存它應該寫入新的值到XML文件。他們還可以選擇添加額外的網址到列表中,甚至可以創建一個全新的監視器部分。

任何幫助/建議將不勝感激。

回答

0

我會去周圍其他的方式爲您的問題:

  1. 定義一個類(或幾類),將持有你所需要的數據。
  2. 使用一個簡單的序列化程序來加載/保存該文件。

如果你這樣做,那麼你選擇的問題只是一個經典的WPF問題。然後

Public Class Monitor 
    Public Property MonitorId As integer 
    Public Property ListOfUrl As List(Of String) 
End Class 

MonitorsConfiguration將引用List(Of Monitor)對象。

您可以使用ViewModel對象輕鬆處理MonitorsConfiguration
ViewModel有一個SelectedMonitorIndex屬性,並更新UrlForThisMonitor索引屬性更改時的url列表。
(很顯然,這應該實現INotifyPropertyChanged)的視圖模型可能是什麼樣子

好了那麼一點點看法:

Public Class MonitorsConfigurationVM 
     Implement INotifyPropertyChanged 

    ' creates a new VM. Throws exception if file name is not valid 
    Public Sub New(ConfigFileName As String) 
     _FileName = ConfigFileName 
     _MonitorsConfiguration = // Deserialization of the file // 
     _MonitorIndex = 0 
    End Sub 

    Public Property MonitorIndex As integer 
    Get 
    return _MonitorIndex 
    End Get 
    Set (Value) 
    if (_MonitorIndex = value) then return 
    ' you might want to perform check here and allow only valid index 
    _MonitorIndex = value 
    _UrlIndex=0 
    NotifyPropertyChanged("MonitorIndex") 
    NotifyPropertyChanged("MonitorUrls") 
    NotifyPropertyChanged("HasUrl") 
    NotifyPropertyChanged("UrlIndex") 
    End Set 
    End Property 

    Public ReadOnly Property HasUrl As Boolean 
    Get 
     return Not (MonitorUrls Is Nothing OrElse MonitorUrls.count = 0) 
     ' (might be used to disable the listbox bound to MonitorUrl) 
    End Get 
    End Property 

    Public ReadOnly Property MonitorUrls As List(Of String) 
    Get 
    return _MonitorConfiguration(_MonitorIndex).ListOfUrl '(you might want to chk) 
    End Get 
    End Property 

    Public Property UrlIndex As Integer 
    Get 
    return _UrlIndex 
    End Get 
    Set (value) 
    if value = _UrlIndex then return 
    ' you might want to perform some check here 
    _UrlIndex = value 
    NotifyPropertyChanged("UrlIndex") 
    End Set 
    End Property 

' And Also : AddMonitor/ AddUrl/SaveConfiguration/... 

    Private _FileName As String = Nothing 
    Private _MonitorsConfiguration As List(Of Monitor)=Nothing 
    Private _MonitorIndex As integer = 0 

    Protected Sub NotifyPropertyChanged(ByVal name As String) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) 
    End Sub 

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 

End Class 
+0

謝謝,我會給予一個去 – William

+0

討厭成爲那些傢伙之一,但你能給我一個如何創建ViewModel對象的代碼示例嗎? – William

+0

不知道你是否更新了編輯:我編輯了我的帖子btw :-) – GameAlchemist

0

您應該使用XPath來解析XML文檔。

  • 負載在爲XMLDocument
  • 的XML文件創建的XmlNodeList和使用XPath從加載的XML
    文檔中選擇節點。
  • 然後根據id解析節點列表並提取所選監視器的所有信息
    節點。

下面是XPath表達式對您有所幫助:

  1. 對於從文件選擇監測節點: 「/ControlCenter的/監控
  2. 對於基於顯示器ID選擇browser_na場:「/ControlCenter/Monitor [monitor_id ='0']/browser_short_na
  3. 對於基於顯示器ID的選擇網址:」/ControlCenter/Monitor [monitor_id ='0']/url_list/url/url_na

希望它適合你。

+0

謝謝,我會給予一個去 – William