Powershell 将我的 xml 文件格式从 UNIX (LF) UTF-8 更改为 Windows (CR LF) UTF-8-BOM
Powershell changes my xml File format from UNIX (LF) UTF-8 to 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)
谢谢
如果要将 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() inserts empty square brackets in doctype declaration
我正在用 powershell 更新一些 xml 文件,它们来自 Linux 机器。 一旦我完成更新,文件就乱七八糟,有多余的空格等,不好,我不能使用它。
Changes from:
UNIX )(LF) UTF-8
To
Windows (CR LF) UTF-8-BOM
有谁知道如何保持和我保存回来的一样的格式。
$myfile = "C:\hrfeed\output$file"
$stringToXML.save($myfile)
谢谢
如果要将 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() inserts empty square brackets in doctype declaration