You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DOMDocument验证TEI XML时提示"No DTD found!"该如何解决?

问题原因

你的XML文档使用了TEI命名空间,但未关联DTD文件;而DOMDocument::validate()方法仅支持验证DTD约束,但在线验证服务通常是基于XML Schema(XSD)自动匹配TEI的规范进行验证的,两者验证标准不一致,因此出现本地报错但在线通过的差异。

解决方法

根据你的验证需求,有两种可行方案:

方案1:改用DTD验证

在XML文档开头添加TEI的DTD声明,让validate()方法能找到对应的DTD规则:

  1. 修改XML内容,加入DOCTYPE声明:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TEI PUBLIC "-//TEI//DTD TEI P5//EN" "http://www.tei-c.org/release/xml/tei/custom/schema/tei_all.dtd">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<!-- 原XML内容不变 -->
</TEI>
  1. 确保PHP允许加载外部实体(PHP 8.0+默认关闭,需手动开启):
    在代码开头添加libxml_disable_entity_loader(false);(若使用PHP 8.0+,建议将DTD下载到本地,避免外部实体加载的安全风险)。

方案2:改用XML Schema(XSD)验证(推荐,符合TEI P5规范)

放弃validate()方法,使用schemaValidate()或schemaValidateSource()验证TEI的XSD约束:

  1. 先从TEI官方下载对应的XSD文件(推荐保存到本地项目中,避免网络依赖)
  2. 修改PHP验证逻辑:
libxml_use_internal_errors(true);

$xml = '<?xml version="1.0" encoding="utf-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader> <fileDesc> <titleStmt> <title/> <author/> </titleStmt>
<publicationStmt> <publisher /> </publicationStmt>
</fileDesc> </teiHeader>
<text>
<body>
<div type="section"><p><label>BLAZE</label>,
a white spot in a horse’s face.</p></div></body></text></TEI>';

$doc = new DOMDocument;
$doc->loadXML($xml);

// 替换为你本地TEI XSD文件的路径
$teiXsdPath = './tei_all.xsd';
if ($doc->schemaValidate($teiXsdPath)) {
    echo "Looks good.";
} else {
    var_dump(libxml_get_errors());
}

内容的提问来源于stack exchange,提问作者dkretz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:10:27