ASP.NET VB 无法使用 Linq 循环遍历嵌套的 XML 元素
ASP.NET VB Unable to loop through nested XML elements with Linq
我正尝试 read/list 每个 <lat>
和 <long>
指向下面的 XML。
XML 文档是一个大文件(大约 30,000 行),这里是一个非常精简的版本:
Dim strMyXMLString As String = ""
strMyXMLString &= "<job>" & vbCrLf
strMyXMLString &= " <field>" & vbCrLf
strMyXMLString &= " <zones>" & vbCrLf
strMyXMLString &= " <zone>" & vbCrLf
strMyXMLString &= " <zone_id>BEBB35C8</zone_id>" & vbCrLf
strMyXMLString &= " <reference_id>1</reference_id>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141774116</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.754275931</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141170056</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.754093629</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141169615</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.754103682</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " </zone>" & vbCrLf
strMyXMLString &= " <zone>" & vbCrLf
strMyXMLString &= " <zone_id>F9A7ECBB</zone_id>" & vbCrLf
strMyXMLString &= " <reference_id>2</reference_id>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.142055217</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.752604533</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141530045</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.752207708</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141528842</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.752213287</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " </zone>" & vbCrLf
strMyXMLString &= " </zones>" & vbCrLf
strMyXMLString &= " </field>" & vbCrLf
strMyXMLString &= "</job>" & vbCrLf
只有一个 <zones>
个元素,但其中包含许多 <zone>
个元素。
在上面的例子中,我也只列出了每个元素的三个 <point>
坐标,在实际的 XML 文件中,每个 <zone>
大约有 700 个 <point>
值=]元素.
我需要遍历每个 <zone>
元素并检索 <zone_id>
、<reference_id>
以及每个元素中包含的每个 <lat>
和 <lng>
<zone>
.
以下代码:
Dim strMyXMLDoc = System.Xml.Linq.XDocument.Parse(strMyXMLString)
Dim zone = From point In strMyXMLDoc...<zones>.<zone> Select point
For Each item In zone
' Output some stuff
Response.Write("<br>")
Response.Write("<br>zone_id: " & item.<zone_id>.Value)
Response.Write("<br>reference_id: " & item.<reference_id>.Value)
' This only lists the FIRST <lat> found and no more, which is technically right as we are still in the <zone> loop
Response.Write("<br>first lat: " & item.<point>.<lat>.Value)
Response.Write("<br>first lng: " & item.<point>.<lng>.Value)
' Getting desparate, try a nested loop
Dim zone_point = From nested_points In strMyXMLDoc...<zones>.<zone>.<point> Select nested_points
For Each zone_item In zone_point
Response.Write("<br>lat: " & item.<point>.<lat>.Value)
Response.Write("<br>lng: " & item.<point>.<lng>.Value)
Next
Next
产生以下输出:
zone_id: BEBB35C8
reference_id: 1
first lat: 54.141774116
first lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
zone_id: F9A7ECBB
reference_id: 2
first lat: 54.142055217
first lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
如您所见,它重复第一个 <lat>
和 <lng>
六次。
我也尝试过这个小的代码更改:
Dim strMyXMLDoc = System.Xml.Linq.XDocument.Parse(strMyXMLString)
Dim zone = From point In strMyXMLDoc...<zones>.<zone> Select point
For Each item In zone
' Output some stuff
Response.Write("<br>")
Response.Write("<br>zone_id: " & item.<zone_id>.Value)
Response.Write("<br>reference_id: " & item.<reference_id>.Value)
' This only lists the FIRST <lat> found and no more, which is technically right as we are still in the <zone> loop
Response.Write("<br>first lat: " & item.<point>.<lat>.Value)
Response.Write("<br>first lng: " & item.<point>.<lng>.Value)
' Getting desparate, try a nested loop
Dim zone_point = From nested_points In strMyXMLDoc...<zone>.<point> Select nested_points
For Each zone_item In zone_point
Response.Write("<br>lat: " & zone_item.<lat>.Value)
Response.Write("<br>lng: " & zone_item.<lng>.Value)
Next
Next
但这给出了以下输出(它现在列出了它找到的所有点,每个 zone
):
zone_id: BEBB35C8
reference_id: 1
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
zone_id: F9A7ECBB
reference_id: 2
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
所以我们那里有空白值,但它又循环了六次(而不是三次,对吧?)
我想要的输出需要是:
zone_id: BEBB35C8
reference_id: 1
first lat: 54.141774116
first lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
zone_id: F9A7ECBB
reference_id: 2
first lat: 54.142055217
first lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
请问我做错了什么?
已解决!
此代码块:
Dim strMyXMLDoc = System.Xml.Linq.XDocument.Parse(strMyXMLString)
Dim zone = From point In strMyXMLDoc...<zones>.<zone> Select point
For Each item In zone
' Output some stuff
Response.Write("<br>")
Response.Write("<br>zone_id: " & item.<zone_id>.Value)
Response.Write("<br>reference_id: " & item.<reference_id>.Value)
' Nested loop
Dim nested_point = item.<point>
For Each zone_point In nested_point
Response.Write("<br>lat: " & zone_point.<lat>.Value)
Response.Write("<br>lng: " & zone_point.<lng>.Value)
Next
Next
提供以下输出:
zone_id: BEBB35C8
reference_id: 1
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
zone_id: F9A7ECBB
reference_id: 2
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
键行是:
Dim nested_point = item.<point>
我正尝试 read/list 每个 <lat>
和 <long>
指向下面的 XML。
XML 文档是一个大文件(大约 30,000 行),这里是一个非常精简的版本:
Dim strMyXMLString As String = ""
strMyXMLString &= "<job>" & vbCrLf
strMyXMLString &= " <field>" & vbCrLf
strMyXMLString &= " <zones>" & vbCrLf
strMyXMLString &= " <zone>" & vbCrLf
strMyXMLString &= " <zone_id>BEBB35C8</zone_id>" & vbCrLf
strMyXMLString &= " <reference_id>1</reference_id>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141774116</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.754275931</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141170056</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.754093629</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141169615</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.754103682</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " </zone>" & vbCrLf
strMyXMLString &= " <zone>" & vbCrLf
strMyXMLString &= " <zone_id>F9A7ECBB</zone_id>" & vbCrLf
strMyXMLString &= " <reference_id>2</reference_id>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.142055217</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.752604533</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141530045</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.752207708</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " <point>" & vbCrLf
strMyXMLString &= " <lat>54.141528842</lat>" & vbCrLf
strMyXMLString &= " <lng>-0.752213287</lng>" & vbCrLf
strMyXMLString &= " </point>" & vbCrLf
strMyXMLString &= " </zone>" & vbCrLf
strMyXMLString &= " </zones>" & vbCrLf
strMyXMLString &= " </field>" & vbCrLf
strMyXMLString &= "</job>" & vbCrLf
只有一个 <zones>
个元素,但其中包含许多 <zone>
个元素。
在上面的例子中,我也只列出了每个元素的三个 <point>
坐标,在实际的 XML 文件中,每个 <zone>
大约有 700 个 <point>
值=]元素.
我需要遍历每个 <zone>
元素并检索 <zone_id>
、<reference_id>
以及每个元素中包含的每个 <lat>
和 <lng>
<zone>
.
以下代码:
Dim strMyXMLDoc = System.Xml.Linq.XDocument.Parse(strMyXMLString)
Dim zone = From point In strMyXMLDoc...<zones>.<zone> Select point
For Each item In zone
' Output some stuff
Response.Write("<br>")
Response.Write("<br>zone_id: " & item.<zone_id>.Value)
Response.Write("<br>reference_id: " & item.<reference_id>.Value)
' This only lists the FIRST <lat> found and no more, which is technically right as we are still in the <zone> loop
Response.Write("<br>first lat: " & item.<point>.<lat>.Value)
Response.Write("<br>first lng: " & item.<point>.<lng>.Value)
' Getting desparate, try a nested loop
Dim zone_point = From nested_points In strMyXMLDoc...<zones>.<zone>.<point> Select nested_points
For Each zone_item In zone_point
Response.Write("<br>lat: " & item.<point>.<lat>.Value)
Response.Write("<br>lng: " & item.<point>.<lng>.Value)
Next
Next
产生以下输出:
zone_id: BEBB35C8
reference_id: 1
first lat: 54.141774116
first lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
zone_id: F9A7ECBB
reference_id: 2
first lat: 54.142055217
first lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
如您所见,它重复第一个 <lat>
和 <lng>
六次。
我也尝试过这个小的代码更改:
Dim strMyXMLDoc = System.Xml.Linq.XDocument.Parse(strMyXMLString)
Dim zone = From point In strMyXMLDoc...<zones>.<zone> Select point
For Each item In zone
' Output some stuff
Response.Write("<br>")
Response.Write("<br>zone_id: " & item.<zone_id>.Value)
Response.Write("<br>reference_id: " & item.<reference_id>.Value)
' This only lists the FIRST <lat> found and no more, which is technically right as we are still in the <zone> loop
Response.Write("<br>first lat: " & item.<point>.<lat>.Value)
Response.Write("<br>first lng: " & item.<point>.<lng>.Value)
' Getting desparate, try a nested loop
Dim zone_point = From nested_points In strMyXMLDoc...<zone>.<point> Select nested_points
For Each zone_item In zone_point
Response.Write("<br>lat: " & zone_item.<lat>.Value)
Response.Write("<br>lng: " & zone_item.<lng>.Value)
Next
Next
但这给出了以下输出(它现在列出了它找到的所有点,每个 zone
):
zone_id: BEBB35C8
reference_id: 1
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
zone_id: F9A7ECBB
reference_id: 2
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
所以我们那里有空白值,但它又循环了六次(而不是三次,对吧?)
我想要的输出需要是:
zone_id: BEBB35C8
reference_id: 1
first lat: 54.141774116
first lng: -0.754275931
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
zone_id: F9A7ECBB
reference_id: 2
first lat: 54.142055217
first lng: -0.752604533
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
请问我做错了什么?
已解决!
此代码块:
Dim strMyXMLDoc = System.Xml.Linq.XDocument.Parse(strMyXMLString)
Dim zone = From point In strMyXMLDoc...<zones>.<zone> Select point
For Each item In zone
' Output some stuff
Response.Write("<br>")
Response.Write("<br>zone_id: " & item.<zone_id>.Value)
Response.Write("<br>reference_id: " & item.<reference_id>.Value)
' Nested loop
Dim nested_point = item.<point>
For Each zone_point In nested_point
Response.Write("<br>lat: " & zone_point.<lat>.Value)
Response.Write("<br>lng: " & zone_point.<lng>.Value)
Next
Next
提供以下输出:
zone_id: BEBB35C8
reference_id: 1
lat: 54.141774116
lng: -0.754275931
lat: 54.141170056
lng: -0.754093629
lat: 54.141169615
lng: -0.754103682
zone_id: F9A7ECBB
reference_id: 2
lat: 54.142055217
lng: -0.752604533
lat: 54.141530045
lng: -0.752207708
lat: 54.141528842
lng: -0.752213287
键行是:
Dim nested_point = item.<point>