2013-02-22 47 views
8

以下XML 不能从德尔福,因为它包含无效°符号阅读:阅读°的XML德尔福度的符号2010

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

看来,德尔福认识在XML中执行此操作的“标准”方法:

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

Delphi 确实似乎处理这个OK:

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

由于我从RESTful Web服务获取数据,我不是特别有未来整个XML数据包的控制,我只是需要能够阅读它们。

问题

  1. 如果V2是做它的标准XML方式,那么为什么不德尔福的支持呢?或者是否有一种特殊的方式来处理我不知道的情况?
  2. V1 XML是否严重形成?如果是这样,我应该请求将RESTful接口更改为以V3格式导出。

使用德尔福2010年。任何帮助,将不胜感激。

回答

1

只要详细说明David的答案,只要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)。)

+0

谢谢,这是正确的答案。我最初使用Delphi给出的任何默认值生成了该文件。然而,我然后打开并使用Notepad ++编辑该文件,这似乎将其恢复为ANSI。所以我去了Format菜单,选择了UTF-8选项,然后确保我的角色看起来正确,并且BAM - 它工作正常!非常感谢,已经学到了一些新的东西,星期一早上只有上午10点! – 2013-02-24 23:11:57

9

德尔福本身并没有解析XML。一个第三方XML引擎,不管它是MSXML,OpenXML,AtomXML等。TXMLDocument组件和支持接口只是一个包装框架,大部分解析由其他人完成。

V1可能会或可能没有格式错误。它取决于XML的实际字符集。

V2实际上并不是标准配置。并非所有的XML引擎都支持它。显然,你使用Delphi的不是。

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

+2

关于V3 ,我会说“所有*上面的* XML引擎都支持这种语法”(或至少*应该*支持它)。 – kobik 2013-02-22 13:45:07

+1

@Kobik,如果有些东西不支持数字字符引用,我很难将它分类为XML解析器。 – 2013-02-22 13:54:54

+0

@kobik NCR是XML标准的一部分,因此如果解析器无法处理它们,那么它不是一个XML解析器。 – 2013-02-22 13:55:37

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

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

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

这将使用命名实体。在XML中,只有five pre-defined named entitiesQUOT安培LTGT。 XML文档可以定义其他命名实体,但这是不寻常的。所以,看起来deg不是您的文档的有效命名实体。

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

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


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

因此,我们直接编码非ASCII字符。您应该确保您的XML使用UTF-8字符集进行了正确的编码,并且该方法可以正常工作,并且可以导致可读和干净的文档。

+0

我检查了我的XML文档,并且它使用UTF-8进行了__not__编码,因此我将XML标题更改为“<?xml version =”1.0“encoding =”UTF-8“?>' 但这似乎没有任何影响。我正在使用MSXML,它似乎仍然在UTF-8中以°编码引起错误。 – 2013-02-24 22:50:43

+1

更改标题不会更改实际文件的编码。如果文件编码正确,则可以直接编码任何Unicode字符。 – 2013-02-24 22:58:53

+0

看来我的文本编辑器Notepad ++将我的编码切换回ANSI(见下文),所以无论我放在XML标题中它实际上都没有**编码**这种方式。 – 2013-02-24 23:14:46