XML ドキュメントをロードし、実行してから、XML を文字列としてテーブルに挿入するコードが$xmlDoc.SelectNodes($XPath)
ありforeach($node in $nodes)
ます。
このコードは、ca のファイルで正常に動作します。10 レコードで 100KB。
ただし、ca のファイルがあります。100MBと約。50k レコードで、コードが停止します$xmlDoc =[xml](gc $xmlpath)
(そして、使用可能なすべてのシステム メモリを使用します)。$nodes
最初に XML ドキュメント全体を解析せずに配列を生成するより良い方法はありますか?
# Loads xml document
$xmlpath = $filepath
$xmlDoc =[xml](gc $xmlpath)
$nodes = $xmlDoc.SelectNodes('//root') #One element per record in SQL
...
$SqlQuery = @"
INSERT INTO {0} VALUES ({1})
"@
....
foreach($node in $nodes)
{
$StringWriter = New-Object System.IO.StringWriter
$XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter
$XmlWriter.Formatting = "None"
$XmlWriter.Flush()
$StringWriter.Flush()
$node.WriteTo($XmlWriter)
#data content (for this quote)
$Pxml = "`'"+$StringWriter.ToString()+"`'"
#Write to database
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = [string]::Format($sqlquery, $tableName, $Pxml)
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteScalar()
}
XML ドキュメントの構造は次のとおりです。
<xml>
<root>
...
</root>
<root>
...
</root>
</xml>
結果の文字列の形式は次のとおりです。
<root>
...
</root>