在Delphi 2010中从XML读取°度符号

时间:2013-02-22 05:36:39

标签: xml delphi delphi-2010

以下XML 无法 从Delphi中读取,因为它包含无效的°符号:

V1:   <Item Id="1" Description="90° Hinge"/>

似乎Delphi 认识到在XML中执行此操作的“标准”方式:

V2:   <Item Id="1" Description="90&deg; Hinge"/>

Delphi 确实 似乎可以解决这个问题:

V3:   <Item Id="1" Description="90&#176; Hinge"/>

由于我从RESTful Web服务获取数据,因此我无法控制所遇到的XML数据包,我只需要能够读取它们。

问题

  1. 如果V2是标准的XML方式,那为什么Delphi不支持这个呢?或者有一种特殊的方法可以处理这个我不知道的事情吗?
  2. V1 XML是否刚开始形成?如果是这样,我应该要求将RESTful接口更改为以V3格式导出°。
  3. 使用Delphi 2010.任何帮助都将不胜感激。

3 个答案:

答案 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&deg; Hinge"/>

这使用命名实体 deg 。在XML中,只有five pre-defined named entities quot amp lt GT 。 XML文档可以定义其他命名实体,但这是不寻常的。因此, deg 似乎不是您文档的有效命名实体。

V3:   <Item Id="1" Description="90&#176; Hinge"/>

此版本使用numeric character reference,NCR。您可以使用NCR指定任何Unicode代码点。


关于你应该做什么,我们可以立即排除命名实体。我还建议避免为所有非ASCII字符批量使用NCR。这只会导致难以理解的文件。当然,如果您必须使用非Unicode识别工具来处理文档,那么使用NCR是唯一的方法。

这样我们就可以直接编码非ASCII字符了。您应该确保使用UTF-8字符集正确编码XML,并且该方法可以很好地工作,并且可以生成可读且干净的文档。

答案 2 :(得分:1)

只是详细说明David的答案,XML不会排除文本节点中的任何值(除了极少数保留字符),只要它们在当前编码中有效。

您的问题中有一些遗漏的事实:

  1. 您是否使用文本编辑器生成此XML? 如果是这样,那么您必须检查保存文件时使用的编码。试试UTF-8。如果您的文档是使用“windows”编码生成的,请尝试将编码属性添加到XML控件标记,即<?xml version="1.0" encoding="iso-8859-1"?>

  2. 您是否使用Delphi String函数生成此XML? 如果是这种情况,Delphi使用的编码默认为UTF-8,但如果您正在从外部源读取片段,则可能会无意中将其与其他编码混合。对于这个问题,除了使用XML库内置函数来创建XML之外,没有银弹。

  3. 当我不得不处理这些事情时(对于XML签名,不能少!)我使用包装器来使用任何字符串,并使用显式编码(我使用type Latin1String = type AnsiString(28591)。)