XML与DTD验证报错:元素内容不匹配问题排查求助
XML DTD验证错误排查
问题描述
我是一名西班牙Web开发专业学生,目前正在学习标记语言,需创建XML文档及对应的DTD来完成验证,但遇到了「元素内容必须匹配」的错误。以下是用于验证的XML文档和编写的DTD代码,无法定位错误所在,恳请帮忙排查:
原XML代码
<?xml version="1.0" encoding="UTF-8"?> <!-- Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license Click nbfs://nbhost/SystemFileSystem/Templates/XML/XMLDocument.xml to edit this template --> <!DOCTYPE academia SYSTEM "actividad2_dtd.dtd"> <academia> <matriculas> <matricula> <cod_matricula>M83928971-22</cod_matricula> <administrativo> <nombre_administrativo>Francisco Javier Ruiz Barrosa</nombre_administrativo> <dni_administrativo>62637169V</dni_administrativo> </administrativo> <fecha_matricula>14/09/2022</fecha_matricula> <importe_matricula moneda = "Euro">59,67</importe_matricula> <pago forma="Transferencia"/> //Paypal, Bizum, Tarjeta, Trasnferencia <metodo_envio modo="Urgente"/> <fecha_entrega></fecha_entrega> <observaciones>Matricula Parcial</observaciones> //Opcional </matricula> <alumnado> <alumno> <identificacion> <cod_alumno>RG8293</cod_alumno> <fecha_nacimiento>05/03/1998</fecha_nacimiento> <dni_alumno>53584168X</dni_alumno> //Opcional </identificacion> <tipo_curso>completo</tipo_curso> <nombre_completo> <nombre_alumno>Juan Pablo</nombre_alumno> <primer_apellido>Sanchez</primer_apellido> <segundo_apellido>Valdes</segundo_apellido> </nombre_completo> <direccion> <via>Calle Trebujena</via> <numero_via>14</numero_via> <localidad>Chipiona</localidad> <provincia>Cádiz</provincia> <codigo_postal>11550</codigo_postal> </direccion> <telefono> <movil></movil> <fijo></fijo> </telefono> <repetidor> <repite>Si</repite> <numero_repeticiones>1</numero_repeticiones> </repetidor> </alumno> </alumnado> <cursos> <curso> <cod_curso>CAL1988-45</cod_curso> <idioma>Ingles</idioma> <nivel>A1</nivel> <precio moneda="Euro"></precio> </curso> </cursos> </matriculas> </academia>
原DTD代码
<?xml version="1.0" encoding="UTF-8"?> <!-- Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license Click nbfs://nbhost/SystemFileSystem/Templates/XML/emptyDTD.dtd to edit this template --> <!-- TODO define vocabulary identification data PUBLIC ID : -//vendor//vocabulary//EN SYSTEM ID : http://server/path/__NAME__ --> <!-- TODO define your own vocabulary/syntax. Example follows: --> <!ELEMENT academia (matriculas)> <!ELEMENT matriculas (matricula, alumnado, cursos)> <!ELEMENT matricula (cod_matricula, administrativo, fecha_matricula, importe_matricula, pago, metodo_envio, fecha_entrega, observaciones?)> <!ELEMENT cod_matricula (#PCDATA)> <!ELEMENT administrativo (nombre_administrativo, dni_administrativo)> <!ELEMENT nombre_administrativo (#PCDATA)> <!ELEMENT dni_administrativo (#PCDATA)> <!ELEMENT fecha_matricula (#PCDATA)> <!ELEMENT importe_matricula (#PCDATA)> <!ATTLIST importe_matricula moneda CDATA #REQUIRED> <!ELEMENT pago (#PCDATA)> <!ATTLIST pago forma (Paypal|Bizum|Tarjeta|Transferencia) #REQUIRED> <!ELEMENT metodo_envio (#PCDATA)> <!ATTLIST metodo_envio modo CDATA #REQUIRED> <!ELEMENT fecha_entrega (#PCDATA)> <!ELEMENT observaciones (#PCDATA)> <!ELEMENT alumnado (alumno)> <!ELEMENT alumno (indentificacion, tipo_curso, nombre_completo, direccion, telefono, repetidor )> <!ELEMENT identificacion (cod_alumno, fecha_nacimiento, dni_alumno?)> <!ELEMENT cod_alumno (#PCDATA)> <!ELEMENT fecha_nacimiento (#PCDATA)> <!ELEMENT dni_alumno (#PCDATA)> <!ELEMENT tipo_curso (#PCDATA)> <!ELEMENT nombre_completo (nombre_alumno, primer_apellido, segundo_apellido)> <!ELEMENT nombre_alumno (#PCDATA)> <!ELEMENT primer_apellido (#PCDATA)> <!ELEMENT segundo_apellido (#PCDATA)> <!ELEMENT direccion (via, numero_via, localidad, provincia, codigo_postal)> <!ELEMENT via (#PCDATA)> <!ELEMENT numero_via (#PCDATA)> <!ELEMENT localidad (#PCDATA)> <!ELEMENT provincia (#PCDATA)> <!ELEMENT codigo_postal (#PCDATA)> <!ELEMENT telefono (movil,fijo?)> <!ELEMENT movil (#PCDATA)> <!ELEMENT fijo (#PCDATA)> <!ELEMENT repetidor (repite,numero_repeticiones)> <!ELEMENT repite (#PCDATA)> <!ELEMENT numero_repeticiones (#PCDATA)> <!ELEMENT cursos (curso)> <!ELEMENT curso (cod_curso,idioma,nivel,precio)> <!ELEMENT cod_curso (#PCDATA)> <!ELEMENT idioma (#PCDATA)> <!ELEMENT nivel (#PCDATA)> <!ELEMENT precio (#PCDATA)> <!ATTLIST precio moneda CDATA #REQUIRED>
错误排查与修正
1. 元素名拼写错误
DTD中定义alumno的子元素为indentificacion(多了一个n,拼写错误),但XML中实际使用的是identificacion。需修改DTD中对应的元素名:
<!ELEMENT alumno (identificacion, tipo_curso, nombre_completo, direccion, telefono, repetidor )>
2. 空元素与DTD定义不匹配
DTD中定义pago和metodo_envio为(#PCDATA)(要求必须包含文本内容),但XML中这两个元素是空元素(<pago/>、<metodo_envio/>)。需将DTD中这两个元素的定义改为EMPTY:
<!ELEMENT pago EMPTY> <!ELEMENT metodo_envio EMPTY>
3. XML注释格式错误
XML中使用了//作为注释开头,这是非法的(XML注释必须用<!-- 内容 -->格式)。这些非法注释会被当作元素内容,导致验证失败。需修正所有注释:
- 将
//Paypal, Bizum, Tarjeta, Trasnferencia改为<!-- Paypal, Bizum, Tarjeta, Transferencia --> - 将
//Opcional改为<!-- Opcional -->
修正后的XML代码
<?xml version="1.0" encoding="UTF-8"?> <!-- Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license Click nbfs://nbhost/SystemFileSystem/Templates/XML/XMLDocument.xml to edit this template --> <!DOCTYPE academia SYSTEM "actividad2_dtd.dtd"> <academia> <matriculas> <matricula> <cod_matricula>M83928971-22</cod_matricula> <administrativo> <nombre_administrativo>Francisco Javier Ruiz Barrosa</nombre_administrativo> <dni_administrativo>62637169V</dni_administrativo> </administrativo> <fecha_matricula>14/09/2022</fecha_matricula> <importe_matricula moneda = "Euro">59,67</importe_matricula> <pago forma="Transferencia"/> <!-- Paypal, Bizum, Tarjeta, Transferencia --> <metodo_envio modo="Urgente"/> <fecha_entrega></fecha_entrega> <observaciones>Matricula Parcial</observaciones> <!-- Opcional --> </matricula> <alumnado> <alumno> <identificacion> <cod_alumno>RG8293</cod_alumno> <fecha_nacimiento>05/03/1998</fecha_nacimiento> <dni_alumno>53584168X</dni_alumno> <!-- Opcional --> </identificacion> <tipo_curso>completo</tipo_curso> <nombre_completo> <nombre_alumno>Juan Pablo</nombre_alumno> <primer_apellido>Sanchez</primer_apellido> <segundo_apellido>Valdes</segundo_apellido> </nombre_completo> <direccion> <via>Calle Trebujena</via> <numero_via>14</numero_via> <localidad>Chipiona</localidad> <provincia>Cádiz</provincia> <codigo_postal>11550</codigo_postal> </direccion> <telefono> <movil></movil> <fijo></fijo> </telefono> <repetidor> <repite>Si</repite> <numero_repeticiones>1</numero_repeticiones> </repetidor> </alumno> </alumnado> <cursos> <curso> <cod_curso>CAL1988-45</cod_curso> <idioma>Ingles</idioma> <nivel>A1</nivel> <precio moneda="Euro"></precio> </curso> </cursos> </matriculas> </academia>
修正后的DTD代码
<?xml version="1.0" encoding="UTF-8"?> <!-- Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license Click nbfs://nbhost/SystemFileSystem/Templates/XML/emptyDTD.dtd to edit this template --> <!-- TODO define vocabulary identification data PUBLIC ID : -//vendor//vocabulary//EN SYSTEM ID : http://server/path/__NAME__ --> <!-- TODO define your own vocabulary/syntax. Example follows: --> <!ELEMENT academia (matriculas)> <!ELEMENT matriculas (matricula, alumnado, cursos)> <!ELEMENT matricula (cod_matricula, administrativo, fecha_matricula, importe_matricula, pago, metodo_envio, fecha_entrega, observaciones?)> <!ELEMENT cod_matricula (#PCDATA)> <!ELEMENT administrativo (nombre_administrativo, dni_administrativo)> <!ELEMENT nombre_administrativo (#PCDATA)> <!ELEMENT dni_administrativo (#PCDATA)> <!ELEMENT fecha_matricula (#PCDATA)> <!ELEMENT importe_matricula (#PCDATA)> <!ATTLIST importe_matricula moneda CDATA #REQUIRED> <!ELEMENT pago EMPTY> <!ATTLIST pago forma (Paypal|Bizum|Tarjeta|Transferencia) #REQUIRED> <!ELEMENT metodo_envio EMPTY> <!ATTLIST metodo_envio modo CDATA #REQUIRED> <!ELEMENT fecha_entrega (#PCDATA)> <!ELEMENT observaciones (#PCDATA)> <!ELEMENT alumnado (alumno)> <!ELEMENT alumno (identificacion, tipo_curso, nombre_completo, direccion, telefono, repetidor )> <!ELEMENT identificacion (cod_alumno, fecha_nacimiento, dni_alumno?)> <!ELEMENT cod_alumno (#PCDATA)> <!ELEMENT fecha_nacimiento (#PCDATA)> <!ELEMENT dni_alumno (#PCDATA)> <!ELEMENT tipo_curso (#PCDATA)> <!ELEMENT nombre_completo (nombre_alumno, primer_apellido, segundo_apellido)> <!ELEMENT nombre_alumno (#PCDATA)> <!ELEMENT primer_apellido (#PCDATA)> <!ELEMENT segundo_apellido (#PCDATA)> <!ELEMENT direccion (via, numero_via, localidad, provincia, codigo_postal)> <!ELEMENT via (#PCDATA)> <!ELEMENT numero_via (#PCDATA)> <!ELEMENT localidad (#PCDATA)> <!ELEMENT provincia (#PCDATA)> <!ELEMENT codigo_postal (#PCDATA)> <!ELEMENT telefono (movil,fijo?)> <!ELEMENT movil (#PCDATA)> <!ELEMENT fijo (#PCDATA)> <!ELEMENT repetidor (repite,numero_repeticiones)> <!ELEMENT repite (#PCDATA)> <!ELEMENT numero_repeticiones (#PCDATA)> <!ELEMENT cursos (curso)> <!ELEMENT curso (cod_curso,idioma,nivel,precio)> <!ELEMENT cod_curso (#PCDATA)> <!ELEMENT idioma (#PCDATA)> <!ELEMENT nivel (#PCDATA)> <!ELEMENT precio (#PCDATA)> <!ATTLIST precio moneda CDATA #REQUIRED>
内容的提问来源于stack exchange,提问作者Pablo Sánchez Valdés
相关产品推荐
相关产品推荐

