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>