XML的unparsed entity是指向非XML格式外部资源的实体,这类实体无法被XML解析器直接解析内容,只能通过特定的声明和引用方式在文档中使用,常用于引用图片、音频、二进制文件等非文本类的外部资源。

unparsed entity的声明规则
unparsed entity需要在XML文档的DTD(文档类型定义)部分进行声明,声明时需要指定实体的名称、外部资源的URI以及资源的MIME类型,MIME类型通过NDATA关键字指定。声明的语法格式如下:
<!ENTITY 实体名称 SYSTEM "资源URI" NDATA MIME类型>
其中各个部分的含义如下:
- 实体名称:自定义的实体标识,引用时使用该名称
- SYSTEM:表示实体指向外部系统资源
- 资源URI:外部资源的访问路径,可以是相对路径或绝对路径
- NDATA:固定关键字,用于标识该实体是unparsed entity
- MIME类型:外部资源的媒体类型,比如图片对应image/png,音频对应audio/mpeg等
下面是一个声明unparsed entity的示例,该实体指向一个PNG格式的图片资源:
<!DOCTYPE root [
<!ELEMENT root (img_ref)>
<!ELEMENT img_ref EMPTY>
<!ATTLIST img_ref src ENTITY #REQUIRED>
<!ENTITY my_img SYSTEM "images/logo.png" NDATA PNG>
]>
unparsed entity的引用步骤
unparsed entity不能直接像普通内部实体那样在元素内容中通过&实体名称;的方式引用,必须通过属性来引用,且属性的类型需要声明为ENTITY。具体引用步骤如下:
第一步:声明引用实体的属性
在DTD中,为需要引用unparsed entity的元素声明一个类型为ENTITY的属性,该属性用于承载unparsed entity的引用。如上面的示例中,为img_ref元素声明了src属性,类型为ENTITY,且为必填属性。
第二步:在元素属性中引用实体
在XML文档实例中,使用该元素时,将属性的取值设置为unparsed entity的名称,不需要添加&和;符号。示例如下:
<root>
<img_ref src="my_img"/>
</root>
这里的my_img就是之前声明的unparsed entity的名称,解析器会识别该属性引用的是对应的图片资源。
引用注意事项
在引用unparsed entity时,需要注意以下几点:
- unparsed entity必须在DTD中先声明再引用,否则解析器会报未定义实体的错误
- 引用unparsed entity的属性类型必须是
ENTITY,不能是CDATA等其他类型,否则解析器无法识别该引用指向的是unparsed entity - NDATA后面的MIME类型需要和实际资源的类型匹配,否则可能导致后续处理资源的程序无法正确识别资源格式
- 如果XML解析器不支持unparsed entity,即使声明和引用格式正确,也可能无法处理这类实体,使用前需要确认解析器的兼容性
完整示例
下面是一个完整的XML文档示例,包含unparsed entity的声明和引用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root (file_ref)*>
<!ELEMENT file_ref EMPTY>
<!ATTLIST file_ref resource ENTITY #REQUIRED>
<!ENTITY doc_file SYSTEM "docs/说明.pdf" NDATA application_pdf>
<!ENTITY img_file SYSTEM "images/banner.jpg" NDATA image_jpeg>
]>
<root>
<file_ref resource="doc_file"/>
<file_ref resource="img_file"/>
</root>
在这个示例中,声明了两个unparsed entity分别指向PDF文档和JPG图片,然后在file_ref元素的resource属性中分别引用了这两个实体,符合unparsed entity的引用规范。
XMLunparsed_entityENTITY声明DTDNDATA修改时间:2026-06-14 20:39:30