2013-02-13 44 views
1

我試圖從PHP repository of the online documentation加載XML文件。這是DocBook標準。如何用PHP的DomDocument加載具有在其他文件中定義的命名實體的DocBook XML文件?

然而,當我加載一個XML文件,我得到這樣的錯誤:

警告:DOM文檔:: load()方法:實體 'reftitle.intro' 沒有定義

我有點明白錯誤,但我有問題來解決它。我試着用外部實體加載器回調(libxml_set_external_entity_loader),但它只是調用一次,文件本身。

所以不知何故,我想我需要告訴DOMDocument要麼a)忽略那些未定義的實體或b)提供這些實體。

有:

<!ENTITY reftitle.intro  '<title xmlns="http://docbook.org/ns/docbook">Introduction</title>'> 

名爲language-defs.ent一個文件,其中包含像DTD內的所有這些實體,e.g但我不知道如何利用這一點。也許這只是一天的時間。

回答

0

粗略的時刻,因爲我不知道爲什麼,但是(一個可能已經足夠了):

$fake = '<?xml version="1.0"?> 
<!DOCTYPE book [ 
<!ENTITY % myent SYSTEM "file:///c:/path%20to/phpdoc-en-svn/extensions.ent"> 
%myent; 
<!ENTITY % myent SYSTEM "file:///c:/path%20to/phpdoc-en-svn/language-defs.ent"> 
%myent; 
<!ENTITY % myent SYSTEM "file:///c:/path%20to/phpdoc-en-svn/language-snippets.ent"> 
%myent; 
]>'; 

,然後(所有XML $file配備需要被去除的XML聲明):

$doc = new DOMDocument(); 
$buffer = file_get_contents($file); 
libxml_use_internal_errors(true); 
$result = $doc->loadXML($fake.strstr($buffer, "\n")); 

然後它就起作用了。它仍然有錯誤,因此libxml_use_internal_errors,但是XML文件正在加載。

並非所有實體都已解決。

相關問題