【问题标题】:Powershell changes my xml File format from UNIX (LF) UTF-8 to Windows (CR LF) UTF-8-BOMPowershell 将我的 xml 文件格式从 UNIX (LF) UTF-8 更改为 Windows (CR LF) UTF-8-BOM
【发布时间】:2020-09-24 20:11:18
【问题描述】:

我正在使用 Powershell 更新一些 xml 文件,它们源自 Linux 机器。 完成更新后,文件被多余的空格弄乱了,我无法使用它。

Changes from:
UNIX )(LF) UTF-8

To
Windows (CR LF) UTF-8-BOM

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

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

谢谢

【问题讨论】:

  • 我又尝试了一些东西。 dos2unix 来转换文件并尝试相反的方式,因为它是 UNIX 我尝试了 unix2dos。但没有区别。一旦文件被powershell读写,我就会看到空格和额外的双引号出现,方括号出现。 @Theo
  • ]> 第一行的那些双引号是单身一次,以前没有乡绅括号。 + 格式现在是 Windows (CR LF)

标签: xml powershell unix xml-parsing utf


【解决方案1】:

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

以您的previous question 为例,您可以这样做:

[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

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

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

【讨论】:

  • @Evo ..不确定你的意思..如果你想循环多个 xml 文件,为什么不Get-ChildItem -Filter '*.xml' -File | ForEach-Object { [xml]$xmldata = Get-Content -Path $_.FullName -Raw; #code to update the xml; Out-UnixXml $xmldata $_.FullName}
  • 嗨西奥,再次感谢您的回复。实际上,在您的示例中,文件已经搞砸了。只是直到现在我才意识到。现在示例: BEFORE 。现在:]> 之前:。此外,如果你往下看,你会看到到处都是空格。您的示例在格式保存方面有效,但所有额外字符的显示方式相同。如果我尝试粘贴它,有没有办法发布所有代码?谢谢
  • 对不起仍在试图找出这个网站 ctrl+ k 在 cmets 上对我不起作用。
  • 我只是尝试读写而不对文件进行任何更改,它仍然添加了空格、乡绅刹车、双引号。
  • @Evo 为什么要在 XML 中使用单引号?通常它们是双引号,任何 xml 阅读器都应该能够处理它们。见Quotes in XML. Single or double?。另外,我不知道您所说的添加空格是什么意思。什么空间?如果您想要压缩的 XML,只需执行 $settings.Indent = $false
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 2019-07-15
  • 1970-01-01
  • 2011-03-16
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多