1

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

但是,当我加载 XML 文件时,会出现以下错误:

警告:DOMDocument::load(): 实体 'reftitle.intro' 未定义

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

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

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

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

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

4

1 回答 1

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 文件。

并非所有实体都已解决。

于 2013-02-14T00:08:56.327 回答