Почему мои настройки отступа игнорируются в XmlWriter в Powershell? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть скрипт Powershell, который форматирует документ XML.Мне бы хотелось, чтобы отступ вставлялся во вкладку, поэтому я использую XmlWriter и передаю ему то, что я считаю подходящими настройками.

Однако вместо этого результат имеет отступ с пробелами:

Фактический результат:
The actual result, with spaces

Желаемый результат:
The desired result, with tabs

Моя функция выглядит следующим образом:

function Format-XML ($xml) 
{ 
    $stringbuilder = New-Object System.Text.StringBuilder
    $settings = New-Object System.Xml.XmlWriterSettings
    $settings.Indent = $true
    $settings.IndentChars = "`t`t"

    $xmlWriter = [System.XML.XmlWriter]::Create($stringbuilder, $settings)
    $xml.WriteContentTo($xmlWriter) 
    $xmlWriter.Close()

    return [xml]$stringbuilder.ToString()
}

Если я установлю для $ settings.IndentChars значение x`t`t, я вижу, как оно вступает в силу - перед каждой строкой стоит префикс x, за которым следует пара вкладок, как и ожидалось.

Почему мои IndentChars игнорируются, когда я указываю только пару вкладок?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Одно из решений - в методе, описанном выше, не было ничего плохого, но, похоже, я сохранил полученный XML-код.

Вместо преобразования возвращаемого значения метода Format-Xml в XML, ятеперь возвращаем строку:

#return [xml]$stringbuilder.ToString()
return $stringbuilder.ToString()

Код, который приводит к пробелам, а не к табуляциям:

$xmlDocument = Format-XML($xmlDocument)
$xmlDocument.Save($filePath)

Новый код, который принимает результат Format-Xml в виде строки, иприводит к желаемому выводу (с вкладками), это:

$formattedXmlString = Format-XML($xmlDocument)
$formattedXmlString | out-file $filePath

Спасибо @JohnLBevan за то, что поставили меня на правильный путь.

0 голосов
/ 18 октября 2018

Попробуйте это:

function Format-XML ([xml]$xml) 
{ 
    $stringbuilder = New-Object System.Text.StringBuilder
    $settings = New-Object System.Xml.XmlWriterSettings
    $settings.Indent = $true
    $settings.IndentChars = "`t`t"

    $xmlWriter = [System.XML.XmlWriter]::Create($stringbuilder, $settings)
    $xml.WriteContentTo($xmlWriter) 
    $xmlWriter.Close()

    $xmlDoc = [System.Xml.XmlDocument]::new()
    $xmlDoc.PreserveWhitespace = $true
    $xmlDoc.LoadXml($stringbuilder.ToString())
    return $xmlDoc
}

т.е. проблема вызвана явным приведением к XML, поскольку в исходном коде нет ничего, что указывало бы на сохранение пробела.

Вышеуказанное изменениесоздает новый XMLDocument, устанавливает для параметра preserve white-space значение true, затем анализирует вашу строку и возвращает полученный XML.

Возможно, существует лучший способ сделать это с помощью параметров в XmlWriter (я быУдивлен, если бы не было), но я недостаточно знаком, чтобы знать, что нужно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...