Предполагая, что вы используете SQL Server, вы должны разобрать XML в DataTable
s и использовать объект SqlBulkCopy
, чтобы перебросить их в базу данных очень быстро. Есть много ресурсов, которые помогут вам узнать о SqlBulkCopy. Вот недавнее обсуждение другого вопроса StackOverflow, с которого можно начать: Sql Server 2008 Настройка с большими транзакциями (700 КБ + строки / транзакция)
Если файл XML действительно большой, вам следует быть осторожным, какой тип парсера вы используете. XDocument и XmlDocument загружают все это в память. Если файлы достаточно малы, скажем, менее 10 МБ, с этими синтаксическими анализаторами у вас все будет в порядке.
EDIT:
Вот краткий макет того, как вы можете получить XML в DataTables. Он в VB, так как VB делает XML немного проще.
Option Strict On : Option Explicit On : Option Infer On : Option Compare Binary
Imports System.Data
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main()
Dim xml =
<Trip>
<TripDetails id="1">
<DepartureDate/>
<ReturnDate/>
<TripTypeA>3</TripTypeA>
<TripTypeB>1</TripTypeB>
<PurposeOfTrip>vacation</PurposeOfTrip>
<Region>5</Region>
<Countries>
<Country>105</Country>
<Country>135</Country>
</Countries>
<Cities>
<City>Cancun</City>
<City>Tokyo</City>
<City>Mayo</City>
</Cities>
<OverallRating>4</OverallRating>
<Suppliers>53</Suppliers>
<SuppliersComments>Good flight</SuppliersComments>
<Transport>
<TransportType>1</TransportType>
<TransportType>3</TransportType>
</Transport>
<TransportComment>Transportation was fast</TransportComment>
</TripDetails>
</Trip>
Dim dtTripDetails As New DataTable()
With dtTripDetails.Columns
.Add("TripID", GetType(Integer))
.Add("TripTypeA", GetType(Integer))
.Add("DepartureDate", GetType(DateTime))
.Add("TransportComment", GetType(String))
End With
Dim dtTripDetailXrefCountries As New DataTable()
With dtTripDetailXrefCountries.Columns
.Add("TripID", GetType(Integer))
.Add("CountryID", GetType(Integer))
End With
Dim xdetails = From td In xml.Descendants("TripDetails") Select td
For Each xdetailRecord As XElement In xdetails
Dim tripID As Integer = CInt(xdetailRecord.Attribute("id").Value)
Dim tripTypeA As Integer = CInt(xdetailRecord.Element("TripTypeA").Value)
Dim strDepDate As String = xdetailRecord.Element("DepartureDate").Value
Dim depDate As Object = If(String.IsNullOrEmpty(strDepDate), CType(DBNull.Value, Object), CType(DateTime.Parse(strDepDate), Object))
Dim transportComment As String = xdetailRecord.Element("TransportComment").Value
dtTripDetails.Rows.Add(tripID, tripTypeA, depDate, transportComment)
Dim xcountries = From c In xdetailRecord.Element("Countries").Elements("Country") Select c
For Each xcountryRecord As XElement In xcountries
Dim countryID As Integer = CInt(xcountryRecord.Value)
dtTripDetailXrefCountries.Rows.Add(tripID, countryID)
Next
Next
Console.WriteLine("Done")
Console.ReadKey(True)
End Sub
End Module
Кстати: при выполнении ETL такого типа лучше сначала закачать данные в промежуточные таблицы, а не прямо в рабочие таблицы. Таким образом, вы можете проверять типы данных и обеспечивать ссылочную целостность, а также обрабатывать управление ключами и располагать все идеально, без блокировки или загрязнения рабочих таблиц.