在德尔福 2010 中从 XML 读取° 度数符号



以下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格式的export°

使用Delphi 2010。如有任何帮助,我们将不胜感激。

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

V1可能是畸形的,也可能不是畸形的。它取决于XML的实际字符集。

V2实际上不是标准的。并不是所有的XML引擎都支持它。很明显,您在Delphi中使用的那个引擎不支持它。

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

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

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

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

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

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

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


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

因此,我们只能直接对非ASCII字符进行编码。您应该确保您的XML是使用UTF-8字符集正确编码的,并且这种方法会很好地工作,并产生可读和干净的文档。

只要在当前编码中有效,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)。)

最新更新