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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:30:49