我正在尝试以特定顺序提取 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