0

我正在尝试以特定顺序提取 xml 数据。我需要知道为什么在标有 ***** 的部分中这个循环从后代节点中提取数据。我只需要来自该节点“级别”的节点。如果有人可以帮助感谢分配。

这篇文章让我添加了更多的文字,但我对此无话可说。

 Public Sub importPies(piesxml As String, outputcsv As String, version1 As String, pwat As frmDetailProgress)


        Dim xmlDoc As XElement
        Dim xmlNodes, currentNode As IEnumerable(Of XElement)
        Dim textout As String = ""
        Dim x, xl As Long
        Dim RootElements() As String
        Dim nsname As String
        Dim fileroot As String
        Dim primaryElement(0) As String


        Dim fileStreams() As PiesFileStream
        Dim dataline(0) As PIESDataLine
        fileroot = Path.GetFileNameWithoutExtension(outputcsv)
        xmlDoc = XElement.Load(piesxml)
        nsname = "{" & xmlDoc.Elements().ElementAt(1).Name.Namespace.ToString & "}"
        pwat.Invoke(Sub() pwat.add("Setting up for PIES " & version1 & " Conversion to csv"))
        fileStreams = CreatePIESCsvHeader(outputcsv, version1, False)

        ' get root elements

        RootElements = GetPiesRootElements(version1)
        For x = 1 To RootElements.Length - 1
            xmlNodes = From nm In xmlDoc.Elements(nsname & RootElements(x))
            ReDim Preserve primaryElement(primaryElement.Length)
            For xl = 0 To xmlNodes.Count - 1

                If xmlNodes.Elements(xmlNodes.Elements.ElementAt(xl).Name.ToString).Count > 1 Then
                    primaryElement(primaryElement.Length - 1) = xmlNodes.Elements.ElementAt(xl).Name.LocalName.ToString
                    Exit For
                End If

            Next xl



        Next x
        pwat.Invoke(Sub() pwat.add("Starting Conversion to csv .", "G"))
        For x = 1 To RootElements.Length - 1
            pwat.Invoke(Sub() pwat.add("Decoding " & RootElements(x)))

            currentNode = From nm In xmlDoc.Elements(nsname & RootElements(x)) Where nm.Name.LocalName = RootElements(x)

            ' check to see if any nodes exist based from current pies def
            If currentNode.Count > 0 Then

                ' check to see if first node has multiples, if so we will dig into it otherwise we will build from here

                If currentNode(0).DescendantNodes.Count = 1 Then

                    For Each node In currentNode
                        ReDim Preserve dataline(dataline.Length)
                        dataline(dataline.Length - 1) = New PIESDataLine
                        dataline(dataline.Length - 1).FieldName = node.Name.LocalName
                        dataline(dataline.Length - 1).Data = node.Value
                    Next
                    WritePiesData(dataline, fileStreams, RootElements(x))
                    pwat.Invoke(Sub() pwat.add("Single record Decode Method", "G"))
                Else
                    pwat.Invoke(Sub() pwat.add("Multiple record Decode method data lines =" & currentNode.LongCount.ToString, "R"))

                    ' ***** problem is here descendent nodes are included 

                    For Each node As XElement In currentNode

                        ReDim dataline(0)

                        decodeNode(node, dataline)
                        WritePiesData(dataline, fileStreams, RootElements(x))

                    Next
                End If

            Else

                pwat.Invoke(Sub() pwat.add("** No Data **", "R"))
            End If

        Next

currentNode.descendantnodes

        CloseFileStreams(fileStreams)
        pwat.Invoke(Sub() pwat.add("Done !"))
        pwat.Invoke(Sub() pwat.EndAndClose())







    End Sub
4

0 回答 0