다음은 XML의 최상위 자식 요소들을 한 줄씩 레코드로 간주하여 데이터베이스에 삽입하는 방법입니다.
코드 ```
var settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
using (var xmlReader = XmlReader.Create("영한간略사전.xml"))
{
xmlReader.MoveToContent();
xmlReader.Read();
int recordCount = 0;
while (xmlReader.IsStartElement())
{
recordCount++;
var insertCommand = new SqlCommand("INSERT INTO [dict].[dbo].[simplec]([ck]) VALUES (@ck)");
insertCommand.Parameters.AddWithValue("@ck", xmlReader.ReadOuterXml());
dbConnection.Execute(insertCommand);
Console.WriteLine($"데이터 삽입 완료: {recordCount}번째 행");
}
}
}</div>
위에서 삽입된 데이터를 읽어 분석한 후, dc와 js 필드를 추출하여 다른 테이블에 저장합니다.
코드 ```
<div> static void ParseAndStoreData()
{
using (var dbConnection = new SqlConnection(SharedMembers.LocalConnectionString))
{
using (var selectCommand = dbConnection.CreateCommand())
{
selectCommand.CommandText = "SELECT [ck] FROM [dict].[dbo].[simplec]";
dbConnection.Open();
using (var reader = selectCommand.ExecuteReader())
{
while (reader.Read())
{
var ckData = (string)reader["ck"];
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(ckData);
var navigator = xmlDoc.CreateNavigator();
var dcValue = navigator.SelectSingleNode("/CK/DC")?.Value;
var jsNode = navigator.SelectSingleNode("/CK/JS");
if (jsNode != null)
{
var jsValue = jsNode.OuterXml;
using (var insertConnection = new SqlConnection(SharedMembers.LocalConnectionString))
{
using (var insertCommand = insertConnection.CreateCommand())
{
insertCommand.CommandText = "INSERT INTO [dict].[dbo].[jmyh2]([dc], [js]) VALUES(@dc, @js)";
insertCommand.Parameters.Add(new SqlParameter("@dc", SqlDbType.NVarChar) { Value = dcValue });
insertCommand.Parameters.Add(new SqlParameter("@js", SqlDbType.Xml) { Value = jsValue });
insertConnection.Open();
insertCommand.ExecuteNonQuery();
Console.WriteLine(dcValue);
}
}
}
}
}
}
}
}</div>
실제로 XML을 직접 해석한 다음 데이터베이스 테이블에 삽입할 수도 있습니다. 이 예시에서는 XPath 기술을 사용했습니다.
코드 ```
var settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
const string dictionaryName = "OxfordCollocations";
using (var xmlReader = XmlReader.Create(dictionaryName + ".xml"))
{
xmlReader.MoveToContent();
xmlReader.Read();
long recordIndex = 0;
while (xmlReader.IsStartElement())
{
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlReader.ReadOuterXml());
var navigator = xmlDoc.CreateNavigator();
var dcValue = navigator.SelectSingleNode("/CK/DC")?.Value;
var jsNode = navigator.SelectSingleNode("/CK/JS");
recordIndex++;
var insertCommand = new SqlCommand($"INSERT INTO dict.dbo.{dictionaryName}(id, dc, js) VALUES(@id, @dc, @js)");
insertCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.BigInt) { Value = recordIndex });
insertCommand.Parameters.Add(new SqlParameter("@dc", SqlDbType.NVarChar) { Value = dcValue });
insertCommand.Parameters.Add(new SqlParameter("@js", SqlDbType.Xml) { Value = jsNode?.OuterXml });
dbConnection.Execute(insertCommand);
if (recordIndex % 1000 == 0)
Console.WriteLine($"데이터 삽입 완료: {recordIndex:#,##0,000}번째 행");
}
}
}</div>