从 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()
的方法更加稳健。
我有一个 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
这是一个很好的例子,说明为什么你不应该使用成语 - 尽管它很方便。[1] 问题确实是字符编码之一:您的文件是 UTF-8 编码的,但是 Windows PowerShell 的 [xml]$xmldata = (Get-Content $xmlpath)
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()
的方法更加稳健。