8

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

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 格式导出°。

使用 Delphi 2010。任何帮助将不胜感激。

4

3 回答 3

9

Delphi 本身根本不解析 XML。第三方 XML 引擎,无论是 MSXML、OpenXML、AtomXML 等。TXMLDocument 组件和支持接口只是一个包装框架,大部分解析是由其他人完成的。

V1 可能格式错误,也可能不格式错误。这取决于 XML 的实际字符集。

V2实际上不是标准的。并非所有 XML 引擎都支持它。显然,您与 Delphi 一起使用的那个没有。

V3 是标准化的,所有 XML 引擎都支持该语法。

于 2013-02-22T06:27:11.030 回答
9
V1:   <Item Id="1" Description="90° Hinge"/>

在这里,您直接对字符进行了编码。您的代码是否可以解析这取决于您的 XML 文档使用的字符集。因此,如果您的 XML 文档使用 UTF-8 并且编码正确,那么您的 XML 代码将能够解析它。

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

这使用命名实体deg。在 XML 中只有五个预定义的命名实体quotampaposltgt。XML 文档可以定义其他命名实体,但这并不常见。因此,似乎deg不是您文档的有效命名实体。

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

此版本使用数字字符引用NCR。您可以使用 NCR 来指定任何 Unicode 代码点。


至于你接下来应该做什么,我们可以立即排除命名实体。我还建议避免对所有非 ASCII 字符大量使用 NCR。这只会导致无法读取的文档。当然,如果您必须使用不支持 Unicode 的工具来处理文档,那么使用 NCR 是唯一的方法。

这样我们就可以直接编码非 ASCII 字符了。您应该确保您的 XML 使用 UTF-8 字符集正确编码,并且该方法将运行良好,并导致可读和干净的文档。

于 2013-02-22T08:16:12.943 回答
1

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

您的问题中缺少一些事实:

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

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

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

于 2013-02-22T15:08:19.583 回答