所有,我越来越
十六进制值0x3C,是一个无效的属性字符。
在电脑上读取XML文件时出现错误,文件中的文字是日文,而且是日文。
$xml = [xml]@(Get-Content $file)
在XML中的特定位置是相当温和的。
<Control type="select">
据我所知,几乎所有类似的错误都是由字符串中的"< "引起的。所以我检查了我的XML,没有看到任何额外的"< "在不该出现的地方。但后来我发现了一个 补丁说明 说的就是这个。
考虑以下情况 你有一台电脑 正在运行Windows Server 2012。计算机的系统地域设置被设置为日文。您在计算机上以默认设置安装了网络策略和访问服务(NPAS)服务器角色。您尝试运行最佳实践分析工具来扫描网络访问保护(NAP)组件。
听起来有点耳熟,所以我怀疑是由于日本的地理位置或由于XML的一些值中的日本字符。
文件本身的开头是这样的。
<?xml version="1.0" encoding="utf-8"?>
有什么办法吗?
在这种情况下,帮助的是在获取文件内容时明确指定编码。
$xml = [xml]@(Get-Content $file -Encoding UTF8)
下面是一个如何实现这一功能的演示。 这个文件.xml有一个日语字符,用utf8无bom编码。
<こ/>
这个字符是unicode 0x3053:
[int][char]'こ' | % tostring x
3053
'こ' | format-hex -Encoding bigendianunicode
Label: String (System.String) <32532FE4>
Offset Bytes Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 30 53 0S
Powershell 5会假设文件是ascii码的。
[xml]$xml = get-content file.xml
Cannot convert value "<ã“/>" to type "System.Xml.XmlDocument". Error: "The '' character,
hexadecimal value 0x81, cannot be included in a name. Line 1, position 3."
At line:1 char:1
+ [xml]$xml = get-content file.xml
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
Unicode字符0x3053将在utf8中被编码为3个字节,"E3 81 93",因为它属于这个范围。 utf8的位前缀是这样的(https:/en.wikipedia.orgwikiUTF-8。). 三个字节总是以'1110'或'E'开头。 其他的'10'位是它的延续。
1110xxxx 10xxxxxx 10xxxxxx
Xml不会介意E3,因为它是一个a,上面有一条方格线,但是81看起来就像一个空盒子(stackoverflow不能显示它),所以它会导致一个错误。 下面是file.xml的原始字节。 "0D 0A "只是回车和换行。
format-hex file.xml -encoding utf8
Path: C:\Users\admin\foo\file.xml
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 3C E3 81 93 2F 3E 0D 0A <ã“/>..
我不知道具体如何重现op的错误,但它是这样的。