2011-12-29 26 views
1

作爲新的libxml2我很困惑,爲什麼總是xmlParseFile返回nillibxml2的xmlParseFile無法加載一個格式良好的XML

uses 
    libxml2; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    doc: xmlDocPtr; 
begin 
    doc := xmlParseFile('1.xml'); // doc is nil 
    doc := xmlParseFile('c:\1.xml'); // doc is again nil 
end; 

樣品1.XML:

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

XML被報道爲由XML Spy 2007和xmllint工具組成。

我使用http://xmlsoft.org的預編譯DLL,並且用DelphiAPI-2.6.26和libxml2-pas-2-7-3-src嘗試此代碼,但沒有運氣。

我想我錯過了什麼?

調試器剛剛躍過線,因爲它指向一個外部參考這樣的:

function xmlParseFile (const filename: PChar) : xmlDocPtr; cdecl; external LIBXML2_SO; 
+0

調試器說什麼? – 2011-12-29 12:56:29

+0

我一直在C++中使用libxml2多年,沒有任何問題,所以我不得不懷疑Delphi對libxml2的綁定可能存在問題。在libxml2.pas中如何聲明'xmlParseFile()'?真正的函數需要一個'PAnsiChar'作爲輸入。 libxml2.pas是否聲明'xmlParseFile()'使用'PAnsiChar'?這在Delphi XE中很重要,其中原生字符串類型是Unicode而不是Ansi。 – 2011-12-29 18:17:06

+0

你說得對 - 將Delphi包裝從PChar(Xe和XE2中的PWideChar)更改爲PAnsiChar解決了這個問題。一旦函數的定義改爲函數xmlParseFile(const filename:PChar):xmlDocPtr; CDECL;外部LIBXML2_SO;它工作得很好。雷米請讓你評論一個我很樂意接受的答案。 – 2011-12-29 21:20:37

回答

2

與所有信用去雷米我會把答案,而不是他有這個封閉:

將PChar(它是XE和XE2中的PWideChar)的Delphi包裝更改爲PAnsiChar解決了該問題。一旦該功能的定義更改爲

function xmlParseFile (const filename: PWideChar) : xmlDocPtr; cdecl; 
external LIBXML2_SO; 

它工作正常。

相關問題