2012-05-16 19 views
0

我有XML的不尋常的格式如實施例下面如何解析XML具有無限款到數據集

<mainmenu> 
    <menu caption="File"> 
     <menuitem caption="New" tooltip="Create New File" shortcut="Ctrl-N" Action="New"> 
     <menuitem caption="Open" tooltip="Open Existing File" shortcut="Ctrl-O" Action="Open"> 
     <menu caption="Import"> 
      <menuitem caption="As New File" tooltip="Import To New Sheet" shortcut="F11" Action="ImportNew"> 
      <menuitem caption="As Current File" tooltip="Import To Current Active Sheet" shortcut="F12" Action="ImportOpen"> 
     </menu> 
     <menuitem caption="Exit" tooltip="Exit Program" shortcut="Ctrl-Q" Action="Exit"> 
    </menu> 
    <menu caption="Edit"> 
     <menuitem caption="Cut" tooltip="" shortcut="Ctrl-C" Action="Cut"> 
     <menuitem caption="Copy" tooltip="" shortcut="Ctrl-X" Action="Copy"> 
     <menuitem caption="Paste" tooltip="" shortcut="Ctrl-V" Action="Paste"> 
    </menu> 
</mainmenu> 

我需要上面的XML被解析成表格數據查看與數據集,然後可以從一個函數檢索,例如:

getData("Edit") 

result: 

caption tooltip shortcut action 
cut  ... 
copy ... 
paste ... 

又如

getData("File.Import") 

result: 

caption   tooltip shortcut action 
as new file  ... 
as current file ... 

那麼,什麼是最好的方法解析XML?謝謝。

回答

1

Linq to Xml將是一個很好的選擇。您可以根據條件選擇菜單元素,然後根據菜單項元素的屬性選擇所需數據類型的集合。我下面寫了一個例子,它實現了簡單的例子的getData(「編輯」)並填充子菜單項的DataTable(在你的榜樣,複製粘貼)。

Dim xdoc As XDocument 
Dim filename As string // TODO set XML filename 
Dim name As String 
Dim dt as DataTable 
xdoc = XDocument.Load(filename) 
name = "Edit" 
dt = New DataTable() 

xdoc.Root.Elements().Where(Function(s) s.Attribute("caption") = name).Elements("menuitem").ToList(). _ 
    ForEach(dt.Rows.Add(x.Attribute("caption"), x.Attribute("tooltip"), x.Attribute("shortcut"), x.Attribute("action"))) 

應該可以擴展這種方法來根據需要選擇基於「File.Import」等的嵌套菜單項。

+0

謝謝dbaseman –