以下XML 无法 从Delphi中读取,因为它包含无效的°符号:
V1: <Item Id="1" Description="90° Hinge"/>
似乎Delphi 不 认识到在XML中执行此操作的“标准”方式:
V2: <Item Id="1" Description="90° Hinge"/>
Delphi 确实 似乎可以解决这个问题:
V3: <Item Id="1" Description="90° Hinge"/>
由于我从RESTful Web服务获取数据,因此我无法控制所遇到的XML数据包,我只需要能够读取它们。
问题
使用Delphi 2010.任何帮助都将不胜感激。
答案 0 :(得分:9)
Delphi本身根本不解析XML。第三方XML引擎,无论是MSXML,OpenXML,AtomXML等.TXMLDocument组件和支持接口只是一个包装器框架,大部分解析都是由其他人完成的。
V1可能会或可能不会格式错误。这取决于XML的实际字符集。
V2实际上不是标准的。并非所有XML引擎都支持它。显然,你使用Delphi的那个没有。
V3是标准化的,所有XML引擎都支持该语法。
答案 1 :(得分:9)
V1: <Item Id="1" Description="90° Hinge"/>
这里有直接编码字符。您的代码是否可以解析此问题取决于XML文档使用的字符集。因此,如果您的XML文档使用UTF-8并且编码正确,那么您的XML代码将能够解析它。
V2: <Item Id="1" Description="90° Hinge"/>
这使用命名实体, deg 。在XML中,只有five pre-defined named entities: quot , amp , , lt , GT 。 XML文档可以定义其他命名实体,但这是不寻常的。因此, deg 似乎不是您文档的有效命名实体。
V3: <Item Id="1" Description="90° Hinge"/>
此版本使用numeric character reference,NCR。您可以使用NCR指定任何Unicode代码点。
关于你应该做什么,我们可以立即排除命名实体。我还建议避免为所有非ASCII字符批量使用NCR。这只会导致难以理解的文件。当然,如果您必须使用非Unicode识别工具来处理文档,那么使用NCR是唯一的方法。
这样我们就可以直接编码非ASCII字符了。您应该确保使用UTF-8字符集正确编码XML,并且该方法可以很好地工作,并且可以生成可读且干净的文档。
答案 2 :(得分:1)
只是详细说明David的答案,XML不会排除文本节点中的任何值(除了极少数保留字符),只要它们在当前编码中有效。
您的问题中有一些遗漏的事实:
您是否使用文本编辑器生成此XML?
如果是这样,那么您必须检查保存文件时使用的编码。试试UTF-8。如果您的文档是使用“windows”编码生成的,请尝试将编码属性添加到XML控件标记,即<?xml version="1.0" encoding="iso-8859-1"?>
。
您是否使用Delphi String函数生成此XML? 如果是这种情况,Delphi使用的编码默认为UTF-8,但如果您正在从外部源读取片段,则可能会无意中将其与其他编码混合。对于这个问题,除了使用XML库内置函数来创建XML之外,没有银弹。
当我不得不处理这些事情时(对于XML签名,不能少!)我使用包装器来使用任何字符串,并使用显式编码(我使用type Latin1String = type AnsiString(28591)
。)