2016-06-30 4 views
0

Я написал небольшую функцию, которая форматирует отступ XmlDocument и сохраняет кодировку UTF-8. Проблема в том, что я не могу представить WriteContentTo мой экземпляр XmlWriter. Является ли моя реализация неправильной?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, а поток стирает запись с потоком)