首先我需要获取一个文件夹下多个xml文件数据然后让这些数据以列表的形式转成一个csv文件
现在出现了一个问题:运行代码后只能获取到一个xml文件的数据,已经确定文件夹下面有多个.xml文件且没有重名。求大佬解答!
If objDBControl IsNot Nothing Then
objDBControl.Connect()
'文件路径检查
GetFilePath()
'获取xml文件数据
Dim xmlDoc As New XmlDocument()
'Dim xmlrow As New List(Of String)()
'输出文件夹检查
InspectOutputFolder()
'将xml数据列表写入csv文件
'加载xml文件’
xmlDoc = ReadXmlData(xmlDoc)
Try
'创建csv文件
Using sw As New StreamWriter(strcsvFilePath & "xmltocsv.csv", False, System.Text.Encoding.GetEncoding("Shift-JIS"))
'获取xml根元素
Dim xmlroot As XmlElement = xmlDoc.DocumentElement
'获取csv表头
Dim csvheader As New List(Of String)()
For Each xmlnode As XmlNode In xmlroot.ChildNodes
csvheader.Add(xmlnode.Name)
Next
sw.WriteLine(String.Join(",", csvheader))
'获取csv数据行
Dim csvData As New List(Of String)()
For i As Integer = 0 To xmlroot.ChildNodes.Count - 1
Dim strvalue As String = xmlroot.ChildNodes(i).InnerText()
strvalue = ChangeTargetField(strvalue)
csvData.Add(String.Join(",", strvalue))
Next
For Each strvalue As String In csvData
sw.WriteLine(String.Join(",", csvData))
Next
End Using
Catch ex As Exception
Console.WriteLine("xml文件转换未成功")
End Try
objDBControl.DisConnect()
End If
Catch ex As Exception
Me.ErrLog(strMethodName, ex.Message)
Finally
Me.BusinessLog(strMethodName, "")
End Try
End Sub
#End Region
Public Function GetFilePath() As String
Dim intCount As Integer = 0
'1.1检查参数数量
Dim strArgs As String() = Environment.GetCommandLineArgs()
If strArgs.Length <> 2 Then
TraceLog(strMethodName, ConstModule.MSG101)
End If
'检查文件夹路径
If String.IsNullOrEmpty(strxmlFolderPath) Then
TraceLog(strMethodName, ConstModule.MSG102)
End If
If String.IsNullOrEmpty(strcsvFilePath) Then
TraceLog(strMethodName, ConstModule.MSG103)
End If
''检查文件扩展名
If Path.GetExtension(strcsvFilePath).ToLower <> ".csv" Then
TraceLog(strMethodName, ConstModule.MSG104)
End If
'检查文件夹
If Not Directory.Exists(strxmlFolderPath) Then
TraceLog(strMethodName, ConstModule.MSG105)
End If
Return intCount
End Function
'读取xml文件夹中数据
Public Function ReadXmlData(xmlDoc As XmlDocument)
'创建一个空的xml数据列表
Dim listXmlDataList As New List(Of XmlDocument)()
'创建xmldocument对象
'Dim xmlDoc As New XmlDocument()
'检查xml文件夹中是否存在xml文件
If Directory.GetFiles(strxmlFolderPath, "*.xml").Length > 0 Then
'遍历文件夹中所有xml文件
For Each strxmlfiles As String In Directory.GetFiles(strxmlFolderPath)
If strxmlfiles.EndsWith(".xml") Then
For Each strxmlfile As String In strxmlfiles
'获取xml文件中所有节点数据
Dim listallNodes As XmlNodeList = xmlDoc.SelectNodes("//*")
'创建一个新的节点列表
Dim nodelist As New List(Of XmlNode)
'遍历每个节点
For Each Node As XmlNode In listallNodes
nodelist.Add(Node)
Next
Next
'加载xml文件
xmlDoc.Load(strxmlfiles)
'将xml数据添加到列表中
listXmlDataList.Add(xmlDoc)
End If
Next
Else
TraceLog(strMethodName, ConstModule.MSG106)
End If
Return xmlDoc
End Function
Public Function InspectOutputFolder() As String
'1.3输出文件夹检查
'检查输出目标文件夹是否存在,如果不存在则创造
Dim stroutputFolder As String = Path.GetDirectoryName(strcsvFilePath)
If Not Directory.Exists(stroutputFolder) Then
Directory.CreateDirectory(stroutputFolder)
End If
'1.4csv存在性检查
If File.Exists(strcsvFilePath) Then
'如果csv文件已经打开,则显示一条消息
Try
Using File As New FileStream(strcsvFilePath, FileMode.Open, FileAccess.ReadWrite)
TraceLog(strMethodName, ConstModule.MSG107)
End Using
Catch ex As Exception
Console.WriteLine("无法访问输出csv文件")
End Try
'如果csv存在,则删除现有csv文件
Try
File.Delete(strcsvFilePath)
Catch ex As Exception
Console.WriteLine("无法删除现有的csv文件")
End Try
End If
Return 0
End Function
'根据规则对xml目标项目进行更改
Public Function ChangeTargetField(strvalue As String) As String
'对xml文件进行更改
strvalue = strvalue.Replace("&", "&")
strvalue = strvalue.Replace("&nbsp;" & " ", " ")
strvalue = strvalue.Replace("&lt;" & "<", "<")
strvalue = strvalue.Replace("&&gt;" & ">", ">")
'如果超过csv项目的字节数/位数,剪切多余部分
Dim intcsvItemLength As Integer = 500 '实际csv项目的字节数
If strvalue.Length > intcsvItemLength Then
strvalue = strvalue.Substring(0, intcsvItemLength)
End If
Return strvalue
End Function