Как загрузить 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 загружаются.
Не все сущности разрешены.