Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 读取嵌套的xml文件_Vb.net_Linq To Xml - Fatal编程技术网

Vb.net 读取嵌套的xml文件

Vb.net 读取嵌套的xml文件,vb.net,linq-to-xml,Vb.net,Linq To Xml,我有一个如下所示的xml文件: <SalesReps> <SalesRep> <repname> Bob</repname> <repid>100</repid> <customers> <customer> <custname>ABC Company</custname> <cu

我有一个如下所示的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

我同意史蒂夫多格的观点。您可以使用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...

我不太熟悉LINQ来直接回答您的问题,但我想请问您是否已经或将考虑使用XML反序列化来读取XML文档?LINQ是一种查询文档某些部分的便捷方法,但如果您只是阅读整个文档,它似乎需要大量的工作、复杂性和脆弱性。这对于编写非常有用,但问题是如何读取XML文件,这无助于完成。@Taegost-首先,你正在回复一篇超过两年的帖子!其次,我的代码还展示了如何对xml进行反序列化。是的,很抱歉,我没有很好地表达我的评论,我想说的是,这是一个有点复杂的答案,这会让试图解决类似问题的人感到困惑。