VB.Net XMLTextReader不断跳过子元素中的第一个元素

VB.Net XMLTextReader不断跳过子元素中的第一个元素,xml,vb.net,Xml,Vb.net,我希望有人能帮我。。。我正在读取一个从服务器创建的XML文件,一切都很好,只是当我试图处理该文件时,它总是跳过第一个子元素之一。当我在没有处理的情况下运行一个测试时,只有一个直接的读卡器并循环遍历元素,第一个元素就在那里。但是,只要我添加一个检查来查看节点是否是一个元素,它就会跳过一个“附件”元素。以下是我的XML: <Reports xmlns=""> <FinalReport JobID="335417" LineItemID="400391" FileNumber="AG

我希望有人能帮我。。。我正在读取一个从服务器创建的XML文件,一切都很好,只是当我试图处理该文件时,它总是跳过第一个子元素之一。当我在没有处理的情况下运行一个测试时,只有一个直接的读卡器并循环遍历元素,第一个元素就在那里。但是,只要我添加一个检查来查看节点是否是一个元素,它就会跳过一个“附件”元素。以下是我的XML:

<Reports xmlns="">
<FinalReport JobID="335417" LineItemID="400391" FileNumber="AGAINTEST" PropertyID="98765312" PONumber="" PropAddress="9255 John Street" PropCity="Fairfax" PropState="VA" PropZip="22132" OrderStatus="Delivered" ServiceName="Ext Property Inspection">
    <DataCapture>
        <!--Report saved: 7/1/2011 11:28:43 AM by: frank-->
        <report>
            <StreetVisible>No</StreetVisible>
            <Vacant>No</Vacant>
            <SaleSign>No</SaleSign>
            <RentSign>No</RentSign>
            <ExtCondition>Average</ExtCondition>
            <ComparedCondition>Similar</ComparedCondition>
            <DeferredMaintenance>No</DeferredMaintenance>
            <UnderConstruction>No</UnderConstruction>
            <SafetyIssues>No</SafetyIssues>
            <NaturalDisaster>No</NaturalDisaster>
            <PropertyLocation>Gated</PropertyLocation>
            <PropertyUse>Triplex</PropertyUse>
            <Nonresidential>No</Nonresidential>
            <Outbuildings>Shed</Outbuildings>
            <Garage>No</Garage>
            <Carport>No</Carport>
            <Capacity>2</Capacity>
            <AdverseFactors>Railroad</AdverseFactors>
            <PositiveFactors>GolfCourse</PositiveFactors>
            <PropertyType>CondoGarden</PropertyType>
            <HomeFront>Yes</HomeFront>
            <AddressPhoto>Yes</AddressPhoto>
            <StreetScene>Yes</StreetScene>
            <AnyComments>Test some comments here...</AnyComments>
            <FieldRepName>JOE INSPECTIONS</FieldRepName>
        </report>
    </DataCapture>
    <Attachment imageID="1988" extension="jpg" image_type="IMG" Keyed="0" ImageNote="" Image="Base64" />
    <Attachment imageID="1990" extension="jpg" image_type="IMG" Keyed="0" ImageNote="" Image="Base64" />
    <Attachment imageID="1991" extension="jpg" image_type="IMG" Keyed="0" ImageNote="" Image="Base64" />
    <Attachment imageID="1992" extension="jpg" image_type="IMG" Keyed="0" ImageNote="" Image="Base64" />
    <Attachment imageID="1993" extension="jpg" image_type="IMG" Keyed="0" ImageNote="" Image="Base64" />
    <Attachment imageID="1994" extension="jpg" image_type="IMG" Keyed="0" ImageNote="" Image="Base64" />
</FinalReport>
<PDFReport>Base64</PDFReport>
如果我遗漏了什么,请告诉我。。。我已经厌倦了看这个代码;D
谢谢

XmlTextReader被记录为“仅转发”; 我个人对此的解释是,如果你有属性x=1y=2z=3 并尝试使用getattribute(“y”),然后跳过属性“x”,无法返回到它-属性本身不是哈希列表,而是向前搜索的字符串缓冲区

因此,如果输入数据集中缺少一个属性(或顺序错误),这不意味着您将跳转到下一个元素吗?我没有正确地测试它,但似乎符合我编写(然后正确地重新编写)的代码的行为

只有我的2便士;我可能错了——我可能正朝着正确的方向前进,但还没有到达那里——我只是想帮忙

Using reader As XmlTextReader = New XmlTextReader(xdoc.OuterXml, XmlNodeType.Document, Nothing)

                        Dim xData As New OrderResults_Class

                        While reader.Read()

                            If reader.IsStartElement() Then
                                LogDebug.Append(vbCrLf & "Row: " & x & " Is Start: " & reader.IsStartElement() & " Node Type: " & reader.NodeType() & " Element: " & reader.Name & " >> Attributes: " & reader.HasAttributes.ToString & " Value: " & Left(reader.Value, 100))
                                ele = reader.Name

                                Select Case ele
                                    Case "Attachment"
                                        'LogDebug.Append(vbCrLf & "Row: (" & a & ") " & x & " Node Type: " & reader.NodeType() & " Element: " & reader.Name & " >> Attributes: " & reader.HasAttributes.ToString & " Value: " & Left(reader.Value, 100))
                                        If reader.HasAttributes Then
                                            Dim xDataImg As New NVMSOrderResults_Images_Class

                                            Dim myImage() As Byte = ConvertImageFromBase64(reader.GetAttribute("Image"))

                                            With xDataImg
                                                .JobID = CheckOrder
                                                .ImageRef = reader.GetAttribute("imageID")
                                                .FileNumber = rs("FileNumber").ToString
                                                .ImageDescription = reader.GetAttribute("ImageNote")
                                                .ImageType = reader.GetAttribute("extension")
                                                .ImageFile = myImage
                                            End With

                                            Dim ImgRet As String = Process_OrderResults_Images(xDataImg)
                                            If IsNumeric(ImgRet) Then
                                                LogMsg = "[" & rs("FileNumber").ToString & "] Photo Received: " & ImgRet
                                            Else
                                                LogMsg = "[" & reader.GetAttribute("imageID") & "] Error processing photo: " & ImgRet
                                            End If
                                            AppLogging.WriteTableLog(CheckOrder, LogMsg)
                                        End If

                                    Case "FinalReport"
                                        If reader.HasAttributes Then
                                            With xData
                                                .JobID = CheckOrder
                                                .LineItemID = reader.GetAttribute("LineItemID")
                                                .FileNumber = reader.GetAttribute("FileNumber")
                                                .PropertyID = reader.GetAttribute("PropertyID")
                                                .PropAddress = reader.GetAttribute("PropAddress")
                                                .PropCity = reader.GetAttribute("PropCity")
                                                .PropState = reader.GetAttribute("PropState")
                                                .PropZip = reader.GetAttribute("PropZip")
                                                .Service = reader.GetAttribute("ServiceName")
                                            End With
                                            'LogDebug.Append(vbCrLf & "Row: (" & i & ") " & x & " Node Type: " & reader.NodeType() & " Element: " & reader.Name & " >> Attributes: " & reader.HasAttributes.ToString & " Value: " & Left(reader.Value, 100))
                                        End If

                                    Case "DataCapture"
                                        xData.DataCollection = reader.ReadInnerXml

                                End Select
                            ElseIf reader.NodeType = XmlNodeType.Attribute Then
                                LogDebug.Append(vbCrLf & "This is an Attib: " & ele & " Is Start: " & reader.IsStartElement() & " Node Type: " & reader.NodeType() & " Element: " & reader.Name & " >> Attributes: " & reader.HasAttributes.ToString & " Value: " & Left(reader.Value, 100))
                            ElseIf reader.NodeType = XmlNodeType.Text Then
                                If ele = "PDFReport" Then
                                    xData.PDFReport = ConvertImageFromBase64(reader.Value)

                                    'Save Order Results ///////////////////////////
                                    Dim ResultRet As String = Process_OrderResults(xData)
                                    If IsNumeric(ResultRet) Then
                                        LogMsg = "[" & rs("FileNumber").ToString & "] Job Successfully Received: " & CheckOrder
                                    Else
                                        LogMsg = "[" & rs("FileNumber").ToString & "] Error processing results: " & ResultRet
                                    End If
                                    AppLogging.WriteTableLog(CheckOrder, LogMsg)
                                End If
                            End If

                            x += 1

                        End While

                        '// Write Debugging Text ////////////////////////////////////////////
                        AppLogging.WriteTableLog(CheckOrder, LogDebug.ToString)

                        y += 1
                    End Using