simplexml_load_fileを使用して、DTDに従わなければならないXMLファイルを解析しています。XMLとDTDはどちらもローカルファイルです。
$obj_xml = simplexml_load_file(
$str_xml_file,
'SimpleXMLElement',
LIBXML_DTDVALID + LIBXML_NOENT
);
if (false === $obj_xml) {
throw new Exception("XML file is not valid");
}
XMLファイルは次のようなものです
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapping SYSTEM 'mapping.dtd' [
<!ENTITY data_file "data.csv">
]>
<mapping>
...
</mapping>
指定されたDTDに従ってXMLが有効でない場合、simplexml_load_fileはfalseを返しますが、そうではないという印象を受けました。$ obj_xmlがLibXMLErrorクラスのインスタンスであるかどうかも確認しようとしましたが、同じ結果になりました。
Simplexml_load_fileではDTDが完全に無視されているようです。名前を変更してみましたが、まだエラーはありません。
私が言ったように、XMLとDTDはどちらもローカルファイルです。$ str_xml_fileはXMLファイルの絶対絶対パス名であり、DTDは同じディレクトリにあります。