2009-12-12 102 views
0

我有一個XML格式的文檔,看起來像這樣:XML在vb.net解析

<?xml version="1.0" encoding="windows-1250"?> 
< Recipe> 
    < Entry name="Stuffed Red Cabbage" ethnicity="Slavic" /> 
    < Cook_Time Hrs="1" Mins="30" /> 
    < Ingredients> 
       < Cabbage Amount="1" Measurement="head" /> 
       < Egg Amount="1" Measurement="unit" /> 
       < Ground_Beef Amount="1" Measurement="lb" /> 
       < Margarine Amount="1/2" Measurement="cup" /> 
       < Onion Amount="1" Measurement="unit" /> 
       < Rice Amount="1" Measurement="cup" /> 
       < Tomato_Soup Amount="3" Measurement="cans" /> 
    < /Ingredients> 
    < Description>core cabbage and boil until leaves start pulling away. Strip leaves and let cool. 
chop onion and place in frying pan with margarine and heat till lightly browned. 
put ground beef, rice, onion, egg and salt to taste in bowl and mix. 
stuff each leaf with mixture. 
put tomato soup and stuffed leaves in pot and cook for about an hour.</Description> 
</Recipe> 

,我有代碼,到目前爲止是這樣的:

OpenFileDialog1.Filter = "RecipeBook files (*.rcp)|*.rcp" 
    If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then 
     Try 
      Dim settings As New XmlReaderSettings() 
      settings.IgnoreComments = True 
      Dim RecipeCard As String = OpenFileDialog1.FileName 
          Dim xmlreader As XmlTextReader 
      xmlreader = New XmlTextReader(RecipeCard) 
      Do While xmlreader.Read 
       'needs to read xml and write appropriate items to database and listview 
       xmlreader.MoveToContent() 
       If xmlreader.Name.Equals("Entry") Then 
        MessageBox.Show(xmlreader.GetAttribute("name") & " " & xmlreader.GetAttribute("ethnicity"), "test") 
       End If 
       If xmlreader.Name.Equals("Cook_Time") Then 
        MessageBox.Show(xmlreader.GetAttribute("Hrs") & " hrs " & xmlreader.GetAttribute("Mins") & " mins", "test") 
       End If 
       If xmlreader.Name.Equals("Ingredients") Then 

       End If 
      Loop 
     Catch 
     End Try 
    End If 

我的問題必須做解析配料部分。我打算做這樣的事情:

Dim IngredientCount As Integer = 0 
Dim count As Integer = (something here that gets the count of subelements inside the Ingredients element) 
        For i = 1 To count 
        MessageBox.Show(xmlreader.GetAttribute("Amount") & " " & xmlreader.GetAttribute("Measurement"), "test") 
        Next 

我只是無法弄清楚如何讓子元素的數量,再怎麼是指每一個連續獲得的名稱,然後那屬性子元素。任何建議將不勝感激。

+0

您使用.net 3.5嗎? Xlinq將使這更容易。 http://msdn.microsoft.com/en-us/vbasic/bb738050.aspx – 2009-12-12 19:58:29

+0

我使用3.5,我需要重用3.5緊湊,以及我會看看。 – MaQleod 2009-12-12 20:02:59

回答

1

如果你想使用XmlTextReader,那麼你可以通過使用ReadSubtree解決您的問題:

If xmlreader.Name.Equals("Ingredients") Then 
    Dim inner As XmlReader 
    inner = xmlreader.ReadSubtree() 
    inner.Read() 
    While inner.Read 
     If inner.IsStartElement Then 
      MessageBox.Show(inner.GetAttribute("Amount") & " " & inner.GetAttribute("Measurement"), "test") 
     End If 
    End While 
End If 

它會更容易,雖然不使用XmlTextReader的,而是使用LINQ到XML。

+0

這個選項對我已有的所有東西都是最好的。就內存而言,它並不是最高效的,但它是最容易實現的。 – MaQleod 2009-12-13 23:14:13

0

我在過去所做的是調用Read()來依次獲取每個子元素。在每個Read()之後,檢查它是否是一個開始元素。如果它不是開始元素,那麼您已經到達封閉式Ingredient標籤的末尾,現在該閱讀下一個。本文檔中的示例代碼可能會有所幫助:

http://msdn.microsoft.com/en-us/library/xaxy929c.aspx

的XmlReader不能給你當前元素的子元素的數量,因爲它一次讀取一個標籤。它還沒有讀過其他元素,所以它不知道有多少元素。如果您想在閱讀XML樹時獲得更多信息,請使用XmlDocument。但是,在你開始處理它之前,XmlDocument會一次將整個文件讀入內存,而XmlReader會在你處理它時從頭到尾讀取文件。 XmlReader應該更快,更具有內存效率。

的這裏示例演示如何通過屬性迭代,如果你不知道提前哪些屬性的元素將有:

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.movetonextattribute.aspx

4

你的一個評論表明您使用的是3.5框架。如果是這樣,那麼你可以利用XML文字來獲得你的解決方案。

Dim data = XDocument.Load(xmlReader) 
Dim count = data.<Ingredients>.Elements().Count() 
+0

Thaaaaaank爲您最終使用XML文字...沒有人似乎知道或使用它們;)+1 – Dario 2009-12-12 20:29:29