如何用PHP加载DocBook XML文件';s在其他文件中定义了命名实体的DomDocument


How to load DocBook XML files with PHP's DomDocument having named entities defined in other file?

我正在尝试从在线文档的PHP存储库加载XML文件。它符合DocBook标准。

然而,当我加载一个XML文件时,我会收到如下错误:

警告:DOMDocument::load():未定义实体"reftitle.introl"

我有点理解这个错误,但我在修复它时遇到了问题。我尝试了外部实体加载器回调(libxml_set_external_entity_loader),但对于文件本身,它只调用了一次。

因此,不知何故,我认为我需要告诉DOMDocument a)忽略那些未定义的实体,或者b)提供这些实体。

有一个名为language-defs.ent的文件,它包含所有这些实体,就像DTD中的一样,例如:

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

但我不知道如何利用它。也许这只是一天中的时间。

目前我还不知道为什么(一个可能已经足够了):

$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文件正在加载。

并非所有实体都已解析。