2012-05-29 58 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