我最近切换为使用Delphi XE7随附的OmniXML,以允许定位iOS。 XML数据来自云服务,并且包含具有base64编码二进制数据的节点。
现在,当调用XMLDocument.LoadFromStream时,我得到了这个观念"Invalid Unicode Character value for this platform"
,似乎是此base64换行序列失败了:
具有base64数据的节点看起来与此类似:
<data>TVRMUQAAAAIAAAAAFFo3FAAUAAEA8AADsAAAAEAAAABAAHAAwABgAAAAAAAAAAAQEBAAAAAAAA
AAMQAAABNUgAAP/f/AAMABAoAAAAEAAAAAEVNVExNAAAAAQAAAAAUWjcUABQAAQD/wAA
AAA=</data>
我将其追溯到
XML.Internal.OmniXML
中的这些行: psCharHexRef:
if CharIs_WhiteSpace(ReadChar) then
raise EXMLException.CreateParseError(INVALID_CHARACTER_ERR, MSG_E_UNEXPECTED_WHITESPACE, [])
else
begin
case ReadChar of
'0'..'9': CharRef := LongWord(CharRef shl 4) + LongWord(Ord(ReadChar) - 48);
'A'..'F': CharRef := LongWord(CharRef shl 4) + LongWord(Ord(ReadChar) - 65 + 10);
'a'..'f': CharRef := LongWord(CharRef shl 4) + LongWord(Ord(ReadChar) - 97 + 10);
';':
if CharIs_Char(Char(CharRef)) then
begin
Result := Char(CharRef);
Exit;
end
else
raise EXMLException.CreateParseError(INVALID_CHARACTER_ERR, MSG_E_INVALID_UNICODE, []);
由于
CharIs_Char(#13)
为false(其中#13是从
读取的CharRef的值),在最后一行引发的异常是例外我该如何解决?
最佳答案
显然,这是OmniXML中的错误。似乎开发人员正在尝试实现XML1.0 which states:
... XML处理器必须接受为Char指定的范围内的任何字符。
字符范围
[2]字符:: =#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
/ *任何Unicode字符,代理块,FFFE和FFFF除外。 * /CharIs_Char
的实现,如下所示:
function CharIs_Char(const ch: Char): Boolean;
begin
// [2] Char - any Unicode character, excluding the surrogate blocks, FFFE, and FFFF
Result := not Ch.IsControl;
end;
这不包括所有控制字符,包括
#x9
(TAB),#xA
(LF)和#xD
(CR)。实际上,由于XML在解析过程中剥离(或可选地用LF代替)回车文字,因此,包含实际回车的唯一方法是在实体值文字中使用字符引用(规范的第2.3节)。这看起来像是一个畅销品,应该作为质量控制报告提交。