如何使用PHP的DomDocument加载DocBook XML文件,该文件在其他文件中定义了命名实体?

时间:2013-02-13 18:29:47

标签: php xml domdocument xml-entities

我正在尝试从PHP repository of the online documentation加载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>'>

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

1 个答案:

答案 0 :(得分: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文件正在加载。

并非所有实体都已解决。