从 Excel 导出后,在 XML 文件和 PowerShell 输出中发现奇怪的字符:​

Strange characters found in XML file and PowerShell output after exporting from Excel: ​

我有一个 XML 文件,我正尝试使用 PowerShell 读取该文件。然而,当我阅读它时,某些 XML 对象的输出中包含以下字符:​

我只是从第三方下载了我需要的 XML 文件,该文件在 Excel 中打开。然后我抓取我需要的列并将它们粘贴到一个新的 Excel 工作簿中。然后我使用 XML 模式映射字段,然后将其导出为 XML 文件,然后我将其用于脚本编写。

在 Excel 电子表格中,我的数据 看起来 干净,但是当我导出它和 运行 PS 脚本时,这些很奇怪字符出现在输出中。导出后这些字符甚至出现在实际的 XML 文件中。我做错了什么?

我尝试使用 -Encoding UTF8,但我对 PowerShell 比较陌生,不确定如何将它适当地应用到我的脚本中。感谢任何帮助!

PowerShell

$xmlpath = 'Path\To\The\File.xml'

[xml]$xmldata = (Get-Content $xmlpath)

$xmldata.applications.application.name

输出示例

​ABC_DEF_GHI​.com​​
​JKL_MNO_PQRS​.com​
TUV_WXY_Z.com
AB_CD_EF_GH​.com

这是一个很好的例子,说明为什么你不应该使用成语
[xml]$xmldata = (Get-Content $xmlpath) - 尽管它很方便。[1] 问题确实是字符编码之一:您的文件是 UTF-8 编码的,但是 Windows PowerShell 的 Get-Content cmdlet 将其解释为 ANSI-encoded缺少 BOM - this answer explains the encoding part in detail.Thanks, choroba.

相反,要确保 XML 文件的字符编码被正确解释,请使用以下内容:

# Note: If you know that $xmlPath contains a *full*, native path,
#       you don't need the Convert-Path call.
($xmlData = [xml]::new()).Load((Convert-Path -LiteralPath $xmlPath))

这将字符编码的解释委托给 System.Xml.XmlDocument.Load .NET API 方法,该方法不仅假定 XML (UTF-8) 的正确默认值,而且尊重作为 XML 声明的一部分的任何显式编码规范(如果存在)(例如,
<?xml version="1.0" encoding="iso-8859-1"?>

另请参阅:

  • 背景信息 this answer 的底部。

  • GitHub proposal #14505,提议引入一个 New-Xml cmdlet 来可靠地解析 XML 文件。


[1] 如果您碰巧提前知道 输入文件的编码,您可以逃避 在您的原始方法 ([xml]$xmldata = (Get-Content -Encoding utf8 $xmlpath) 中使用 Get-Content-Encoding 参数,但是基于 .Load() 的方法更加稳健。