我正在尝试从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>'>
但我不知道如何利用它。也许这只是一天的时间。
答案 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文件正在加载。
并非所有实体都已解决。