2011-11-17 55 views
18

XMLファイルを読み込んで要素を変更してから、ファイルに保存します。どのようなフォーマットを維持し、行の終端記号(CRLF対LF)を一致させながらこれを行うための最良の方法は何ですか?ここでPowershellでXMLを保存してフォーマットを保存する

は私が持っているものですが、それはそれをしません:

$xml = [xml]([System.IO.File]::ReadAllText($fileName)) 
$xml.PreserveWhitespace = $true 
# Change some element 
$xml.Save($fileName) 

問題は余分な改行(XMLで別名空行)が削除され、私はLFとCRLFを混合した後ということです。 PowerShellの初心者を助けるため

感謝:)

+1

「フォーマットを保存する」とはどういう意味ですか? – manojlds

+1

おそらく違いはありませんが、代わりに '$ xml = [xml](Get-Content $ filename)'を試しましたか?それ以外の場合は、ネイティブの.NET XmlDocumentクラスとメソッドを使用して、ファイルをロード、編集、および保存する必要があります。 – Ryan

+2

@manojids空白、改行、タブなどを残しておきたいです。 –

答えて

32

あなたは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) 

は念XmlDocument.LoadまたはXmlDocument.LoadXmlを呼び出す前にPreserveWhitespaceを設定します。

:これはXML属性間の空白を保持しません。空白のXML属性は保持されているように見えますが、の間はではありません。ドキュメントでは、 "ホワイトスペースノード"(node.NodeType = System.Xml.XmlNodeType.Whitespace)を保存し、属性はではないことについて説明しています。

+3

ネイティブのPowerShellの種類は何ですか?すべてが.NETです:) – manojlds

+1

.NETオブジェクトを使用すると修正されました。 –

+2

@manojlds PSはこの場合(psbase)のようないくつかの.NETタイプをカプセル化していますが、PSはまだ.NETであっても少し違うと感じています。 :) – Ryan

1

XmlWriterを使用して保存する場合、既定のオプションは2つのスペースでインデントし、行末を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) 
+0

これを投票すると詳細が表示されます。 * beautified * spacingを指定せずにxml出力が必要な場合に特に便利です。 – TNT

0

、あなたがXmlWriterSettingsのインスタンスを使用することができます常にXmlDocumentのSaveメソッドを呼び出した後、テキストノードのためのLFするように形質転換されますCRLFを修正したい場合。 MilesDavies192s answerと同じXmlWriterを使用しますが、エンコードを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() 
} 
関連する問題