Vb.net 读取嵌套的xml文件
我有一个如下所示的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
<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进行反序列化。是的,很抱歉,我没有很好地表达我的评论,我想说的是,这是一个有点复杂的答案,这会让试图解决类似问题的人感到困惑。