Если ваша цель состоит в том, чтобы получить эти данные в CSV-файл, тогда я бы go передал DataTable. Сначала прочитайте ваш XML в DataTable, затем экспортируйте его в файл CSV. Ваш XML файл очень близок к структуре, которую можно легко импортировать в DataTable. Требуемая структура выглядит следующим образом:
<root>
<record>
<field1>Some Data</field1>
<field2>Some other Data</field2>
<field3>42</field3>
...
</record>
<record>
<field1>...</field1>
<field2>...</field2>
<field3>...</field3>
...
</record>
</root>
Так что вам следует избавиться от ненужного тега «baseExtraData». Если вы можете повлиять на создание xml, очень хорошо. Иначе, некоторые XSLT должны делать эту работу. Поместите это в файл с именем вроде «removebaseExtraData.xslt»:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Standard copy template: for all node where's no other rule: copy as they are -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- The node will be deleted and the included nodes drawn one level upwards -->
<xsl:template match="baseExtraData">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
А вот функция для выполнения XSLT:
Imports System.IO
Imports System.Xml
Public Sub XSLTTransform(ByVal XMLFile As String,
ByVal StylesheetFile As String,
Optional ByVal ResultFile As String = vbNullString)
Dim XSLT As New Xsl.XslCompiledTransform(True)
Dim SelfTransform As Boolean = (ResultFile = vbNullString)
' Load style sheet
Try
XSLT.Load(StylesheetFile)
Catch ex As Exception
Debug.Print(ex.Source & ": " & ex.Message)
Exit Sub
End Try
' Do the transform.
Try
If SelfTransform Then ResultFile = Path.GetTempFileName
XSLT.Transform(XMLFile, ResultFile)
If SelfTransform Then
File.Delete(XMLFile)
File.Move(ResultFile, XMLFile)
End If
Catch ex As Exception
Debug.Print(ex.Source & ": " & ex.Message)
End Try
End Sub
Теперь у вас должно быть что-то вроде этого :
<?xml version="1.0" encoding="UTF-8"?>
<eventLog>
<event>
<type>access1</type>
<sample>Bone</sample>
<age>65</age>
</event>
<event>
<type>access2</type>
<sample>Malow</sample>
<age>11</age>
</event>
</eventLog>
Следующий шаг прост:
Imports System.Xml
Dim XmlFile As XmlReader = XmlReader.Create(MyWorkfile, New XmlReaderSettings())
Dim DS As New DataSet
DS.ReadXml(XmlFile)
XmlFile.Close()
Dim MyDataTable As DataTable = DS.Tables(0)
Здесь MyWorkfile - это путь к вашему (пока что измененному) файлу XML, а MyDataTable - это ваша DataTable. Теперь это должно быть легко экспортировано в CSV. Я еще не сделал этого, поэтому я не могу дать вам один из моих проверенных кодов. Но в net есть множество решений для решения этой задачи, возможно, одна из этих ссылок может помочь (я гуглил «vb. net datatable to csv»):
DataTable to File
Наиболее эффективный способ преобразования таблицы данных в CSV (C#)
http://www.devx.com/vb2themax/Tip/19703