2012-05-29 57 views
1

我有一個XML文件,它看起來像這樣:閱讀嵌套的XML文件

<SalesReps> 
    <SalesRep> 
    <repname> Bob</repname> 
     <repid>100</repid> 
     <customers> 
     <customer> 
      <custname>ABC Company</custname> 
      <custno>51233</custno> 
     </customer> 
     <customer> 
      <custname>XYZ Inc.</custname> 
      <custno>29943</custno> 
     </customer> 
     </customers> 
    </SalesRep> 
    <SalesRep> 
    <repname>Sue</repname> 
     <repid>43</repid> 
     <customers> 
     <customer> 
      <custname>Petes Tire Co</custname> 
      <custno>49999</custno> 
     </customer> 
     <customer> 
      <custname>Suzy's Sewing</custname> 
      <custno>81234</custno> 
     </customer> 
     </customers> 
    </SalesRep> 
</SalesReps> 

我想用下面的代碼來讀取它:

Dim salesreps = From reps In xe.Descendants("SalesReps") Select reps 
Dim el = (From rep In salesreps _ 
Select New With {.repname = rep.<repname>, _ 
       .repid = rep.<repid>, 
       .customers = (From custs In rep.<Customers> _ 
        Select New With { _ 
        .customer = (_ 
         From cust In custs.<customer> _ 
          Select New With { 
          .custname = cust.<custname>.Value, _ 
          .custno = cust.<custno>.Value} _ 
         )} _ 
       ) _ 
       } _ 
) 

我可以得到repname和repid,但沒有得到custname和custno的客戶名單。我究竟做錯了什麼?

Thx

+1

我還沒有與LINQ熟悉直接回答你的問題,但我想問問你,如果你有或將考慮使用XML反序列化來讀取這個XML文檔? LINQ是查詢文檔某些部分的一種便捷方式,但如果您只是閱讀整個文檔,看起來工作量很大,複雜性和易碎性。 –

回答

0

我同意SteveDog。您可以使用Xml序列化程序來執行此操作。下面是一些示例代碼:

Imports System.Xml.Serialization 

<XmlRoot("SalesReps")> _ 
Public Class SalesReps 
    Inherits List(Of SalesRep) 
End Class 

Public Class SalesRep 
    Public Property RepName As String 
    Public Property RepId As Integer 

    <XmlArray("Customers"), XmlArrayItem("Customer")> _ 
    Public Property Customers As List(Of Customer) 

    Public Sub New() 
     Me.Customers = New List(Of Customer)() 
    End Sub 
End Class 

Public Class Customer 
    Public Property CustName As String 
    Public Property CustNo As String 
End Class 

Module Module1                      
    Sub Main()                      

     Dim Reps As New SalesReps()                

     Dim rep As New SalesRep With {.RepId = 100, .RepName = "Bob"}        
     rep.Customers.Add(New Customer With {.CustName = "ABC Company", .CustNo = "51233"})  
     rep.Customers.Add(New Customer With {.CustName = "XYZ Inc.", .CustNo = "29943"})   
     Reps.Add(rep)                    

     rep = New SalesRep With {.RepId = 43, .RepName = "Sue"}         
     rep.Customers.Add(New Customer With {.CustName = "Petes Tire Company", .CustNo = "49999"}) 
     rep.Customers.Add(New Customer With {.CustName = "Suzy's Sewing", .CustNo = "81243"})  
     Reps.Add(rep)                    

     Dim sb As New StringBuilder()                

     Dim xSer As New XmlSerializer(GetType(SalesReps))           
     Using wrt As New StringWriter(sb)               
      xSer.Serialize(wrt, Reps)                
     End Using                     

     Console.WriteLine(sb.ToString())               

     Dim NewReps As SalesReps = Nothing               
     Using rdr As New StringReader(sb.ToString())            
      NewReps = xSer.Deserialize(rdr)              
     End Using                     

     If NewReps IsNot Nothing Then                
      Dim firstRep = NewReps.First()               

      Console.WriteLine(firstRep.RepName)             
      For Each cust As Customer In firstRep.Customers          
       Console.WriteLine(" {0}", cust.CustName)           
      Next                     
     End If                      

     Console.WriteLine("Press ENTER to exit...")            
     Console.ReadLine()                   
    End Sub                      
End Module 

其中產生這樣的輸出:

<?xml version="1.0" encoding="utf-16"?> 
<SalesReps xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SalesRep> 
    <RepName>Bob</RepName> 
    <RepId>100</RepId> 
    <Customers> 
     <Customer> 
     <CustName>ABC Company</CustName> 
     <CustNo>51233</CustNo> 
     </Customer> 
     <Customer> 
     <CustName>XYZ Inc.</CustName> 
     <CustNo>29943</CustNo> 
     </Customer> 
    </Customers> 
    </SalesRep> 
    <SalesRep> 
    <RepName>Sue</RepName> 
    <RepId>43</RepId> 
    <Customers> 
     <Customer> 
     <CustName>Petes Tire Company</CustName> 
     <CustNo>49999</CustNo> 
     </Customer> 
     <Customer> 
     <CustName>Suzy's Sewing</CustName> 
     <CustNo>81243</CustNo> 
     </Customer> 
    </Customers> 
    </SalesRep> 
</SalesReps> 
Bob 
    ABC Company 
    XYZ Inc. 
Press ENTER to exit... 
+0

這對編寫而言非常棒,但問題是如何讀取XML文件,而這無助於完成。 – Taegost

+0

@Taegost - 首先,你正在回覆一個超過兩歲的帖子!其次,我的代碼顯示瞭如何反序列化xml。 –

+0

確實,對不起,我沒有很好地評論我的評論,我的意思是說這是一個有點令人費解的答案,會讓那些試圖解決類似問題的人感到困惑。 – Taegost