2016-06-30 7 views
0

XmlDocumentのインデントをフォーマットし、UTF-8エンコーディングを保持する小さな関数を記述しました。私のXmlWriterインスタンスをWriteContentToにすることができないという問題があります。私の実装はこれに間違っていますか?XmlDocument.WriteContentTo(xmlwriter)がストリームに書き込まない

function Format-XML ([xml]$xml, $indentChars = " ") 
{ 
     $xmlSettings = New-Object System.Xml.XmlWriterSettings 
     $xmlSettings.Indent = $True 
     $xmlSettings.IndentChars = $indentChars 
     $xmlSettings.Encoding = $global:Utf8NoBomEncoding 
     $xmlSettings.NewLineChars = "\r\n" 
     $xmlSettings.NewLineHandling = [System.Xml.NewLineHandling]::Replace 

     $xmlMemoryStream = New-Object System.IO.MemoryStream 
     $xmlWriter = [System.Xml.XmlWriter]::Create($xmlMemoryStream, $xmlSettings) 
     $xml.WriteContentTo($xmlWriter) 
     $formatedAndEncodedXMLString = [System.Text.Encoding]::UTF8.GetString($xmlMemoryStream.ToArray()) 
     $XmlWriter.Flush() 
     Write-Output $formatedAndEncodedXMLString 
} 
+0

ストリームを配列にダンプする前にフラッシュする必要がありますか? – Pawel

+0

それは働いた!まだ学習しているにもかかわらず、なぜストリームについてもっと読まなければならないのかは分かりません。これを回答として提出すれば、それを正しいものとしてマークします。 – TacoMaster6000

+0

データが内部のバッファに入っていました。これは、ファイル/ソケットなどに書き込むときに最適化することです。一度にバイト単位で大きなブロックを書く方が効果的です。フラッシング(およびクロージング)は、内部バッファからのデータが実際のターゲットに書き込まれるようにします。 (ここでは、XmlWriterとMemoryStreamを使用し、ライターがストリームをフラッシュするので、ここでもう一つレベルがあることに注意してください) – Pawel

答えて

2

ストリームを配列にダンプする前に、ライターをフラッシュする必要があります。

データが内部バッファに入っていました。これは、ファイル/ソケットなどに書き込むときに最適化することです。一度にバイト単位で大きなブロックを書く方が効果的です。フラッシング(およびクロージング)は、内部バッファからのデータが実際のターゲットに書き込まれるようにします。 (XmlWriterとMemoryStreamを使用していて、ライターがストリームをフラッシュするので、ここにもう1つのレベルがあることに注意してください)

関連する問題