能否在关联XML文件的外部DTD文件中定义ENTITY实体?
XML外部实体引用失效解决方案
失效核心原因
- 主XML文件未在DOCTYPE中声明外部实体文件的引用规则
- XML解析器默认禁用外部实体加载(为了防范XXE攻击)
- 外部实体文件路径、编码不匹配导致读取失败
具体解决步骤
- 补充主XML文件的DOCTYPE声明,引入外部实体文件
假设你存放实体定义的文件名为entities.dtd,和主XML文件在同一目录,完整的主XML结构示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Car [ <!-- 引用外部DTD实体文件 --> <!ENTITY % externalEntities SYSTEM "entities.dtd"> %externalEntities; ]> <Car no="10" CarID="id_111-110"> <ProductionD>07.12.2010</ProductionD> <MarketValue currency="$">12499.99</MarketValue> <VisitedCountries> <Country no="1"> &MCountry; </Country> <Country no="2"> Andora </Country> </VisitedCountries> </Car>- 开启XML解析器的外部实体加载权限
不同解析器的开启方式不同,常见的配置如下:
- Java SAX/DOM解析:设置特征值
http://xml.org/sax/features/external-general-entities为true - Python lxml解析:初始化解析器时添加参数
resolve_entities=True
注意:开启外部实体加载存在XXE注入攻击风险,仅在XML来源完全可信的场景下使用。
- 确认外部实体文件配置正确
保证entities.dtd文件路径和DOCTYPE中声明的路径一致,文件编码和主XML文件编码统一,内容保留你原有定义即可:
<!ENTITY MCountry "Poland">- 补充主XML文件的DOCTYPE声明,引入外部实体文件
内容的提问来源于stack exchange,提问作者czarniecki
相关产品推荐
相关产品推荐

