2013-12-12 37 views
0

我很抱歉發佈此,因爲它可能是一個愚蠢的簡單過程,但嘗試了幾個方法後,我仍然無法讓我的頭,以使這項工作的最佳途徑。解析XML文檔並保存爲arraylist或替代

我已經創建了一個硬編碼設置的程序,但是我想讓它解析一個XML文件和數據作爲稍後的設置,以便其他用戶可以更新程序而無需更新整個程序(目前只有我自己可以做到這一點,並且一個用戶友好的XML文件可以創造奇蹟)。

到目前爲止,我正在測試另一個項目中的XML閱讀和處理,以便在將任何代碼導入到我的主程序之前讓我知道它,但是我查看了XMLReader和System.Xml.XmlDocument,並且didn我不知道哪種方法對我所要達到的效果最有效。

我使用的XML是:

<ProgramName 
    updated="11/12/13" 
    lastuser="james.xxxxxxx" 
    > 
    <school name="school name" id="1"> 
     <netbios> NETBIOS </netbios> 
     <domainname> SCHOOLNAME.local </domainname> 
     <drives> 
      <!-- Generic variables --> 
      <variable name="server1"> \\server1\ </variable> 
      <variable name="server2"> \\server2\ </variable> 
      <!-- Work drives --> 
      <!-- Note, you can use $server1 or $server2 to use the above variables --> 
      <restriction usergroup="office users"> 
       <drive name="Home Drive"> \\server1\officework$ </drive> 
       <drive name="Office Drive"> \\server1\Office Shared </drive> 
      </restriction> 

      <restriction usergroup="staff users"> 
       <drive name="Home Drive"> \\server1\staffwork$ </drive> 
      </restriction> 

      <restriction usergroup="all users"> 
       <drive name="Staff Shared"> \\server1\staff shared </drive> 
       <drive name="Pupil Shared"> \\server1\pupil shared </drive> 
       <drive name="Another drive"> \\server1\another drive </drive> 
      </restriction> 
     </drives> 
    </school> 
</ProgramName> 

我試圖讓XML看作爲「漂亮」和我會這麼認爲,我的同事可能沒有任何進一步的知識更新(邏輯他們是IT工程師,但沒有編程知識)。

基本上,我會感謝您的建議,以保存這些數據在我的程序的最佳方式。我是否會瀏覽XML文件並將其保存到多維/多個列表,Arraylists等? 請注意,對於不同的學校,將會重複多次,因此文件可能會變得相對較大。

我的程序將做的一件事是根據用戶所屬的用戶組來映射驅動器並相應地命名它們(例如,從'name'屬性),以便它必須遍歷所有適當的驅動器,所以對我來說,將某些東西保存到某種列表/數組/集合中是很有意義的,然後通過它來運行。

我讀過使用System.Xml.XmlDocument比XMLReader更靈活,但我有重複條目,性能差,沒有結束元素檢測的問題。也許我的許多問題都來自理解其背後的過程或邏輯。

我也想擴大它的用途做其他事情,但我已經陷入了閱讀XML文件的第一個障礙。如果能夠提供幫助,我可以發佈自己的代碼,但是我認爲全新的觀點可能會比修改代碼更加有用,而這些代碼在良好的層面上工作並不合適。

誠摯的道歉,如果這是以任何方式不適當的SO或我在發佈這個錯誤。

親切的問候, 詹姆斯。

編輯:有沒有一種方法可以在不回答自己的情況下全部答覆?

我附上了我用於測試的代碼(這只是爲了顯示它的工作原理)。

Public Sub DisplayNodes(_XMLNodes As Xml.XmlNodeList) 
    For Each xNode As System.Xml.XmlNode In _XMLNodes 
     Select Case xNode.NodeType 
      Case XmlNodeType.Element 
       Output("Element: " & xNode.Name) 

       If xNode.Attributes.Count > 0 Then 
        For Each attribute As System.Xml.XmlAttribute In xNode.Attributes 
         Output("Attribute: " & attribute.Name & " = " & attribute.Value) 
        Next 
       End If 

     End Select 

     If xNode.HasChildNodes Then 
      DisplayNodes(xNode.ChildNodes) 
     End If 
    Next 
End Sub 

然後我的想法是中繼到的東西,可以直接引用我的猜測將是一個新的對象(我仍然得到我的頭左右的時候是創造一些新的對象的最佳時間這個)。

我想我會使用XPath找到適當的部分(例如。用戶選擇的學校),然後我需要考慮驅動器映射的最佳存儲類型,以便我可以循環訪問它們。

在硬編碼版本中,我使用了一個Collection,其中Key是驅動器號,值是UNC路徑,並通過集合映射它們。不是很好,我知道。

謝謝。

編輯2

我只是發現http://support.microsoft.com/kb/301220和使用XPath看起來非常有前途的。

我會找到用戶選擇的學校,然後從這裏創建一個包含所有相關元素(netbios,域名等)的對象,並且您會建議使用某種列表/數組作爲驅動器?

對此感到樂觀,我會告訴你的! 謝謝。

回答

0

關於您的一般問題:

根據數據的使用,我想我會創建對應於數據的一個或多個類別。這將會像serilization/deserilization一樣,但是你可能需要做一個自定義的實現。

我不明白的是你對有關使用System.Xml.XmlDocument的「無端元素檢測」問題的評論。這將意味着加載的Xml格式不正確,這使我認爲您正在通過字符串操作創建xml。

你至少應該能夠做到以下幾點:

Dim doc as XmlDocument = new XmlDocument()  
doc.LoadXml(fullFileNamePath) 

如果你不能,那麼你需要纔去任何進一步的XML簡潔(wellformed)。

表現不佳可能是由很多事情造成的。你的文件有多大?應用:我認爲你需要解釋(一個小的具體例子)。 通常你可以這樣做:

doc.SelectNodes("/ProgramName/school/drives/restriction[@usergroup = 'office users']/drive"/> 

這將選擇名爲「主驅動器」和「辦公室驅動」這兩個驅動元件。 這需要有關xpath的知識。

另一種方法是使用XElement和LINQ,但我沒有太多的經驗。

+0

我認爲我的很多問題都在於如何真正理解我如何(或者應該)從XML傳遞信息。基本上,用戶將選擇他們的學校,然後該程序將撥打VPN並隨後運行一系列驅動器映射。 除了使用遞歸子例程來繼續擴展節點的子元素以查找元素,doc.SelectNodes會更有效(假設我知道路徑)嗎? 緩慢是我自己的錯我如何編碼的東西(將發佈一個例子),重複也是一個類似的問題。 – absolutejam

+0

使用XPath似乎是要走的路。我會重寫並嘗試從這裏。 感謝您的幫助。 – absolutejam

+0

我會一直使用內在方法,除非他們已經被證明在某些方面有缺陷。所以XPath,是的:-) 我在我的doc.SelectNodes,我現在已經糾正了一個小小的錯誤。 –