簡體   English   中英

vb.net中的xml解析

[英]xml parsing in vb.net

我有一個xml格式的文檔,看起來像這樣:

    <?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

我只是想不通如何獲取子元素的數量,然后如何依次引用每個子元素來獲取名稱和子元素的屬性。 任何建議將不勝感激。

您的評論之一表明您正在使用3.5框架。 如果是這樣,那么您可以利用XML文字獲取解決方案。

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

如果要使用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 to XML會更容易。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM