我正在尝试从命令行批处理数千个XML文件,但是我收到了与无效字符有关的各种错误消息。
到目前为止,我已经能够以两种不同的方式解决这个问题:
我很困惑,为什么我收到这些错误消息。我看不到原始XML或DTD中的编码,因此XML并不是声称它不是它的东西。
考虑到要处理的文件数量,我发现单独修复每个文件也很麻烦。我想知道是否有任何方法可以通过编程方式修复此问题,例如在XSLT样式表中?
错误消息是:
Error on line 80 column 128 of 12345.dxl: SXXP0003: Error reported by XML parser: Invalid byte 1 of 1-byte UTF-8 sequence.
第128行第80行似乎与缺少的单引号相对应:("这是政府本地服务调整练习")。
我尝试将字符映射添加到XSLT,但我仍然得到同样的错误:
<xsl:output method="text" omit-xml-declaration="yes" indent="no" use-character-maps="curly_quotes"/>
<xsl:character-map name="curly_quotes">
<xsl:output-character character="’" string="‘"/>
<xsl:output-character character="“" string="’"/>
<xsl:output-character character="”" string="“"/>
<xsl:output-character character="–" string="”"/>
</xsl:character-map>
答案 0 :(得分:0)
我安装了iconv工具,确实符合要求。但我还没有想出批处理的语法。为此,我发布了一个单独的问题here。
答案 1 :(得分:0)
回答提出的问题:一般情况下(但见下文),人们无法在XSLT中以编程方式修复编码错误,因为XSLT会对解析的XML文档起作用,而编码错误通常会阻止文档被正确解析,严格来说说话意味着 没有XML文档存在,只有一个八位字节流无法管理XML格式良好。
正如@nwellnhof指出的那样,使用的工具是像iconv一样的字符集转换器。
请注意,虽然在一般情况下,具有编码错误或编码声明不准确的文档将无法通过XML解析阶段,但可能存在例外情况:并非编码声明中的所有错误都可以可靠地检测到。例如,如果有一批文件都被标记为ISO 8859-1,尽管实际上它们是ISO 8859-15(或者,我认为,几乎是ISO 8859的任何其他部分),那么它不太可能XML解析器可以检测到错误;执行近似标识转换并使用所需的编码声明写出其输入的XSLT样式表可以解决此类错误。但这是一个非常特殊的案例。可以在http://cmsmcq.com/2007/dialog.surrogates.xml
找到进一步的讨论(对于那些喜欢这类问题的人)