Как загрузить XML-файлы DocBook с помощью DomDocument PHP с именованными объектами, определенными в другом файле?

Я пытаюсь загрузить файлы XML из хранилища PHP онлайн-документации. Это по стандарту DocBook.

Тем не менее, когда я загружаю XML-файл, я получаю сообщения об ошибках вроде

Предупреждение: DOMDocument::load(): объект 'reftitle.intro' не определен

Я немного понимаю эту ошибку, но у меня проблемы с ее исправлением. Я пробовал с обратным вызовом загрузчика внешних лиц (libxml_set_external_entity_loader) но он вызывается только один раз, для самого файла.

Так или иначе, я думаю, мне нужно сказать DOMDocument либо а) игнорировать эти неопределенные сущности, либо б) предоставить эти сущности.

Есть файл с именем language-defs.ent который содержит все эти объекты, как внутри DTD, например:

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

Но я не знаю, как это использовать. Может быть, это просто время дня.

1 ответ

Приблизительно на данный момент, поскольку я понятия не имею, почему, однако (одного может быть уже достаточно):

$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 загружаются.

Не все сущности разрешены.

Другие вопросы по тегам