2012-01-06 62 views
1

我們正在嘗試將Delphi Environement從Delphi2007遷移到Delphi XE2。我們從Sourceforge下載了最新的Turbopower xml合作伙伴。淨。當我們做一個簡單的測試以加載XML文件,我們得到一個錯誤「無效的XML字符發現」我們的代碼行在Delphi XE 2中使用Turbopower XML合作伙伴

var 
    testxml : UnicodeString; // a normal String in Xe2 
    FModel: TXpObjModel; 
begin 
    FModel := TXpObjModel.Create(nil); //Step 1 
    FModel.LoadMemory(testxml[1], Length(testxml)); //Step2 
end. 

的代碼在第2步失敗當變量「Textxml」類型更改爲AnsiString類型然後,xml被正確加載。

XML編碼是UTF-8

像這樣

<?xml version="1.0" encoding="UTF-8"> 

所以任何人可以建議我們如何加載存儲在Unicode字符串變量類型的XML數據?

+2

我可以建議你放棄Turbo Power XML合作伙伴,並轉到OmniXML,它不需要你調用非類型化參數並自己處理字節緩衝區管理。多麼醜陋的API。 – 2012-01-06 17:15:24

+0

@WarrenP就在這裏。 Turbo Power的東西已經死了,你應該真的嘗試轉向一個主動維護的XML庫。 – 2012-01-06 20:06:11

+0

雖然現在在Delphi 2009和XE以及XE2中使用XML Partner COMPILES時可能會遇到這種情況,但它甚至可能還沒有完全具有Unicode意識,並且不具備Unicode功能。不應該假設這些事情,特別是在舊的不再被任何人主動使用的技術上。 – 2012-01-06 20:54:59

回答

2

你可以嘗試將unicode字符串轉換回UTF8,如:

var 
    textxml: UnicodeString; 
    textutf: UTF8String; 
    FModel: TXpObjModel; 
begin 
    textutf := Utf8Encode(textxml); 
    FModel := TXpObjModel.Create(nil); //Step 1 
    FModel.LoadMemory(textutf[1], ByteLength(textutf)); //Step2 
end; 

此外,你應該使用ByteLength()功能,因爲在內存中的串的實際尺寸爲長*中SizeOf (CharType)。

+1

你可以只寫'textutf:= textxml',讓編譯器做的工作 – 2012-01-06 20:05:32

+0

明確的是比隱 – arthurprs 2012-01-07 04:46:54

+0

嗯,我想我可能會在反射同意你 – 2012-01-07 09:24:55