Значения обновления XML PowerShell в неправильном формате [дубликат]

  $ string = rtrim ($ string, ',');   

Документы для rtrim здесь

19
задан Matthew M. Osborn 17 November 2011 в 02:40
поделиться

3 ответа

Вы можете использовать объект PowerShell [xml] и установить $xml.PreserveWhitespace = $true или сделать то же самое с помощью .NET XmlDocument:

$f = '.\xml_test.xml'

# Using .NET XmlDocument
$xml = New-Object System.Xml.XmlDocument
$xml.PreserveWhitespace = $true

# Or using PS [xml] (older PowerShell versions may need to use psbase)
$xml = New-Object xml
#$xml.psbase.PreserveWhitespace = $true  # Older PS versions
$xml.PreserveWhitespace = $true

# Load with preserve setting
$xml.Load($f)
$n = $xml.SelectSingleNode('//file')
$n.InnerText = 'b'
$xml.Save($f)

Просто установите PreserveWhitespace ] перед вызовом XmlDocument.Load или XmlDocument.LoadXml.

ПРИМЕЧАНИЕ. Это не сохраняет пробел между атрибутами XML! Белое пространство в XML-атрибуты, похоже, сохраняются, но не между . В документации говорится о сохранении «узлов белого пространства» (node.NodeType = System.Xml.XmlNodeType.Whitespace), а не атрибутов.

33
ответ дан Ryan 15 August 2018 в 19:19
поделиться
  • 1
    Что такое родные типы powershell? Все это .NET :) – manojlds 17 November 2011 в 03:34
  • 2
    Исправлено использование объектов .NET. – Matthew M. Osborn 17 November 2011 в 03:37
  • 3
    @manojlds вы правы, хотя PS инкапсулирует некоторые типы .NET, как в этом случае (psbase), поэтому он «чувствует» & quot; немного отличается, даже если это еще .NET. :) – Ryan 17 November 2011 в 05:04
  • 4
    Очень приятно - хотя мне не пришлось использовать «psbase». – Gerard ONeill 28 August 2013 в 02:08
  • 5
    Я также подтвердил, что исправил свои проблемы. Используя PS Version 5.0, мне не пришлось использовать .psbase – AggieEric 15 June 2016 в 17:54

Если вы хотите исправить CRLF, который преобразуется в LF для текстовых узлов после вызова метода Save на XmlDocument, вы можете использовать экземпляр XmlWriterSettings. Использует тот же XmlWriter, что и MilesDavies192s отвечает , но также изменяет кодировку на utf-8 и сохраняет отступы.

$xml = [xml]([System.IO.File]::ReadAllText($fileName))
$xml.PreserveWhitespace = $true

# Change some element

#Settings object will instruct how the xml elements are written to the file
$settings = New-Object System.Xml.XmlWriterSettings
$settings.Indent = $true
#NewLineChars will affect all newlines
$settings.NewLineChars ="`r`n"
#Set an optional encoding, UTF-8 is the most used (without BOM)
$settings.Encoding = New-Object System.Text.UTF8Encoding( $false )

$w = [System.Xml.XmlWriter]::Create($fileName, $settings)
try{
    $xml.Save( $w )
} finally{
    $w.Dispose()
}
1
ответ дан Dan 15 August 2018 в 19:19
поделиться
  • 1
    Вопрос OPs был , сохраняя формат, а также сохраняя соответствие CR и LF . Бывают случаи, когда я не хочу касаться частей файла, даже если это означает поддержание сочетания LF и CRLF. Использование настроек в записи, как вы предлагали, изменило бы все на предопределенный формат. Но это то, чего я действительно хотел. так что спасибо. – papo 25 June 2018 в 21:26

Если вы сохраняете с помощью XmlWriter, то по умолчанию параметры имеют отступ с двумя пробелами и заменяют окончания строки CR / LF. Вы можете настроить эти параметры после создания записи или создать запись с объектом XmlSettings, настроенным с учетом ваших потребностей.

    $fileXML = New-Object System.Xml.XmlDocument

    # Try and read the file as XML. Let the errors go if it's not.
    [void]$fileXML.Load($file)

    $writerXML = [System.Xml.XmlWriter]::Create($file)
    $fileXML.Save($writerXML)
2
ответ дан MilesDavies192 15 August 2018 в 19:19
поделиться
  • 1
    Голосование, хотя вы могли бы предоставить более подробную информацию. Это особенно полезно, когда требуется xml-выход без интервала beautified . – TNT 28 February 2018 в 09:09
Другие вопросы по тегам:

Похожие вопросы: