1

オンライン ドキュメント の PHP リポジトリから XML ファイルを読み込もうとしています。これは DocBook 標準によるものです。

ただし、XML ファイルをロードすると、次のようなエラーが発生します。

警告: DOMDocument::load(): エンティティ 'reftitle.intro' が定義されていません

そのエラーはある程度理解できますが、修正するのに問題があります。外部エンティティ ローダー コールバック ( libxml_set_external_entity_loader) を試してみましたが、ファイル自体に対して 1 回しか呼び出されません。

したがって、どういうわけか、DOMDocument に a) これらの未定義エンティティを無視するか、b) これらのエンティティを提供するように指示する必要があると思います。

language-defs.entDTD 内のようなこれらすべてのエンティティを含むという名前のファイルがあります。

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

しかし、私はそれを利用する方法がわかりません。多分それはちょうどその日の時間です。

4

1 に答える 1

0

ただし、理由がわからないので、大まかに言えば(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 ファイルはロードされています。

すべてのエンティティが解決されるわけではありません。

于 2013-02-14T00:08:56.327 に答える