首先,wiki的内容:
是最值得参考的。
将其和下面这个:
搭配着,一起看,尤其是其中的语法解释:
<!ENTITY name SYSTEM "URI"><!ENTITY name PUBLIC "public_ID" "URI">
很清晰易懂。
这样,才使得我之前对于xml中所用到的public的entity的定义:
<!DOCTYPE chapter [ <!ENTITY % crl_ent PUBLIC "crl.ent" 'null'>%crl_ent; ]>
有了更加清楚的了解。
即,上述entity定义中:
name是crl_ent;
crl.ent是个publicID;
而null其实是个URI,而此处经过测试,写成别的值,比如 https://www.crifan.com 也是可以的。
因为之前设置了catalog了,所以可以去把此处的publicID的crl.ent解析为本地的那个entity文件。
对应的catalog为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE catalog PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd" [ ... ] > <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <public publicId="crl.ent" uri="&config_dir;/entity/crl.ent"/> ... </catalog>
而对于前面提到的:
看懂了里面的例子后,对应的去把public改为system,就是先把catalog配置改为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE catalog [ ... ] > <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <system systemId="crl.ent" uri="&config_dir;/entity/crl.ent"/> ... </catalog>
然后xml中再去把:
<!ENTITY % crl_ent PUBLIC "crl.ent" 'null'>%crl_ent;
改为:
<!ENTITY % crl_ent SYSTEM "crl.ent">%crl_ent;
就可以了。
此处,即为:
crl_ent是个SYSTEM中的name;
而crl.ent是个systemID;
所以,相应的catalog会把对应的crl.ent这个systemID解析为本地的那个&config_dir;/entity/crl.ent文件,就实现了和上面的public的定义同样的效果了。
当前,如果不用catalog,那么就使用相对路径(或绝对路径),即为:
<!DOCTYPE chapter [ <!ENTITY % crl_ent SYSTEM "../../../config//entity/crl.ent">%crl_ent; ]>
也同样可以,但是就没有使用catalog时所具有的方便移植的特点了。
另外,其他也还有很多不错的参考资料:
XML Entities and their Applications
【总结】
至此,算是对于xml的(system和public的)entity定义和catalog,有了个更深的认识了。
也终于解决了之前对于那个
<!ENTITY % crl_ent PUBLIC "crl.ent" ‘null’>%crl_ent;
的困惑了。