首页 > 解决方案 > Powershell 将我的 xml 文件格式从 UNIX (LF) UTF-8 更改为 Windows (CR LF) UTF-8-BOM

问题描述

我正在使用 powershell 更新一些 xml 文件,它们源自 Linux 机器。一旦我更新完文件,就会被多余的空格弄得一团糟,我无法使用它。

Changes from:
UNIX )(LF) UTF-8

To
Windows (CR LF) UTF-8-BOM

有谁知道如何保持与我保存时相同的格式。

$myfile = "C:\hrfeed\output\$file"
$stringToXML.save($myfile)

谢谢

标签: xmlpowershellunixxml-parsingutf

解决方案


如果要将 xml 保存为没有 BOM 的 UTF-8 并使用 unix 样式的换行符\n而不是\r\n,则不能Save()在 Windows 上使用标准方法,需要自己创建一个函数来执行此操作。

以您之前的问题为例,您可以这样做:

[xml]$xmldata = @"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>
<Identity  created="1525465321820" name="Onboarding - GUI - External">
    <Attributes>
    <Map>
        <entry key="displayName" value="Onboarding - GUI " />
        <entry key="firstname" value="Z Orphaned ID" />
    </Map>
    </Attributes>
</Identity>
"@

# do something with the xml data

要将 xml 保存到具有 UNIX 样式换行符和 UTF-8 无 BOM 编码的文件中,您可以使用此函数:

function Out-UnixXml {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true, Mandatory = $true, Position = 0)]
        [xml]$xml,

        [Parameter(ValueFromPipeline = $true, Mandatory = $true, Position = 1)]
        [Alias('FilePath')]
        [string]$Path
    )
    try {
        $settings = [System.Xml.XmlWriterSettings]::new()
        $settings.Indent       = $true                                     # defaults to $false
        $settings.NewLineChars = "`n"                                      # defaults to "`r`n"
        $settings.Encoding     = [System.Text.UTF8Encoding]::new($false)   # $false means No BOM

        $xmlWriter = [System.Xml.XmlWriter]::Create($Path, $settings)

        $xml.WriteTo($xmlWriter)
        $xmlWriter.Flush()
    }
    finally {
        # cleanup
        if ($xmlWriter) { $xmlWriter.Dispose() }
    }
}

并像这样使用它而不是$xmldata.Save('C:\somefile.xml')

Out-UnixXml $xmldata 'C:\somefile.xml'

至于 DOCTYPE 声明中的方括号。请参阅XmlDocument.Save() 在 doctype 声明中插入空方括号


推荐阅读