2011-02-11 191 views
1

我試圖解析這個XML文件,這種類型的佈局:XML解析器需要幫助

<POX> 
    <LIST> 
    <COMPANY> 
     <A_COMPANY>The company here</A_COMPANY> 
     <A_ID>786</A_ID> 
     <A_BASE>USD</A_BASE> 
     <A_YES>Yes</A_YES> 
     <A_NO>No</A_NO> 
     <A_CATEGORY_D>1210043021</A_CATEGORY_D> 
     <A_PRECISION>2</A_PRECISION> 
     <LIST_BREAK> 
     <G_BREAK> 
      <CURRENCY>2</CURRENCY> 
      <SORT_COLUMN>100</SORT_COLUMN> 
      etc.... 
     </G_BREAK> 
     <G_BREAK> 
      <CURRENCY>25</CURRENCY> 
      <SORT_COLUMN>130</SORT_COLUMN> 
      etc.... 
     </G_BREAK> 
     <G_BREAK> 
      <CURRENCY>77</CURRENCY> 
      <SORT_COLUMN>1350</SORT_COLUMN> 
      etc.... 
     </G_BREAK> 
     </LIST_BREAK> 
    ETC........ 

,我不能似乎得到這個代碼的工作吧:

Dim m_xmlr As XmlTextReader 
    m_xmlr = New XmlTextReader("c:\temp\46659024.xml") 
    m_xmlr.WhitespaceHandling = WhitespaceHandling.None 
    m_xmlr.Read() 
    m_xmlr.Read() 

    While Not m_xmlr.EOF 
     m_xmlr.Read() 

     If Not m_xmlr.IsStartElement() Then 
      Exit While 
     End If 

     Dim strTest1 = m_xmlr.GetAttribute("/POX/LIST/COMPANY/LIST_BREAK/G_BREAK") 

     m_xmlr.Read() 

     Dim strTest2 = m_xmlr.ReadElementString("CURRENCY") 
     Dim strTest3 = m_xmlr.ReadElementString("SORT_COLUMN") 

     Console.WriteLine("test1: " & strTest1 _ 
      & " test2: " & strTest2 & " test3: " _ 
      & strTest3) 
     Console.Write(vbCrLf) 
     Console.Read() 
    End While 

我得到一個錯誤的

Dim **strTest2 = m_xmlr.ReadElementString("CURRENCY")** 

說:

Element 'CURRENCY' was not found. Line 4, position 4. 

此外,strTest1返回爲什麼

我能怎麼會錯誤地做什麼?

謝謝!

更新 這是工作,但它似乎並沒有得到所有的項目..

m_xmld = New XmlDocument() 
    m_xmld.Load("c:\temp\o1293688.xml") 
    m_nodelist = m_xmld.SelectNodes("/POXPOVPS/LIST_G_COMPANY/G_COMPANY/LIST_G_VENDORS_BREAK/G_VENDORS_BREAK") 

    Dim ListItem1 As ListViewItem 

    'Loop through the nodes 
    For Each m_node In m_nodelist 
     vendorName(x) = m_node.ChildNodes.Item(3).InnerText 'Name of Vendor 
     ListItem1 = ListView1.Items.Add(vendorName(x), 1) 
     x = x + 1 
    Next 

    x = 0 

    m_nodelist = m_xmld.SelectNodes("/POXPOVPS/LIST_G_COMPANY/G_COMPANY/LIST_G_VENDORS_BREAK/G_VENDORS_BREAK/LIST_G_SITE_1/G_SITE_1") 

    For Each m_node In m_nodelist 
     vendorAddress(x) = m_node.ChildNodes.Item(0).InnerText 'Address of Vendor 
     vendorTotal(x) = m_node.ChildNodes.Item(5).InnerText 'Total for vendor 
     ListView1.Items(0).SubItems.Add(vendorAddress(x)) 
     ListView1.Items(0).SubItems.Add(vendorTotal(x)) 
     x = x + 1 
    Next 

的VENDORNAME得到一個總的X = 1435個 的vendorAddress和vendorTotal得到一個總的x = 1481 .....那不是打算把值時,一起是好....

大衛

+0

是否有任何理由使用XmlReader而不是比較簡單易用的LINQ to XML? – 2011-02-11 13:49:16

+0

沒有理由。剛剛看到這個例子,所以我用它。 – StealthRT 2011-02-11 13:59:25

回答

1

你可以使用這個對於初學者..

' Load XML from somewhere... 
    Dim xml As XElement = XElement.Parse(GetXML()) 

    ' Traverse. 
    For Each company In xml.Element("LIST").Elements("COMPANY") 

     Console.WriteLine(String.Format("Company: {0}", company.Element("A_COMPANY").Value)) 
     For Each gBreak In company.Element("LIST_BREAK").Elements("G_BREAK") 

      Console.WriteLine(String.Format("Currency: {0}", gBreak.Element("CURRENCY").Value)) 
      Console.WriteLine(String.Format("Sort Column: {0}", gBreak.Element("SORT_COLUMN").Value)) 
     Next 

    Next 

'約束getXML()函數只返回一個字符串,它可以來自文件,數據庫,XML文本等

代碼進行了測試,並取得了以下...

公司:這裏的公司
貨幣:2
排序列:100
貨幣:25
排序列:130
貨幣:77
排序列:1350

Private Function GetXML() As String 
    Return <POX> 
       <LIST> 
        <COMPANY> 
         <A_COMPANY>The company here</A_COMPANY> 
         <A_ID>786</A_ID> 
         <A_BASE>USD</A_BASE> 
         <A_YES>Yes</A_YES> 
         <A_NO>No</A_NO> 
         <A_CATEGORY_D>1210043021</A_CATEGORY_D> 
         <A_PRECISION>2</A_PRECISION> 
         <LIST_BREAK> 
          <G_BREAK> 
           <CURRENCY>2</CURRENCY> 
           <SORT_COLUMN>100</SORT_COLUMN> 

          </G_BREAK> 
          <G_BREAK> 
           <CURRENCY>25</CURRENCY> 
           <SORT_COLUMN>130</SORT_COLUMN> 

          </G_BREAK> 
          <G_BREAK> 
           <CURRENCY>77</CURRENCY> 
           <SORT_COLUMN>1350</SORT_COLUMN> 
          </G_BREAK> 
         </LIST_BREAK> 
        </COMPANY> 
       </LIST> 
      </POX>.ToString() 
End Function 
0

忽略不使用LINQ to XML作爲建議,騰出來的錯誤是

Dim strTest1 = m_xmlr.GetAttribute("/POX/LIST/COMPANY/LIST_BREAK/G_BREAK") 

的getAttribute是獲得一個XML屬性,以便與節點的getAttribute(「ATTR 「)會返回」1「。使用XmlTextReader無法將xpath路徑指向節點,因此必須自己編寫xml遍歷。