2013-02-22 30 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