首页 > 解决方案 > 元素必须匹配 XML & DTD

问题描述

验证器说有些元素必须与 DTD 匹配。

我尝试使用 xml 验证器 web 和 XML Copy 编辑器对其进行验证。

这是 XML 代码:

<empresa>
    <empleados>
        <oficinistas>
            <oficinista>Juan Fernando</oficinista>
            <oficinista>Josue Gallardo</oficinista>
        </oficinistas>
        <tecnicos>
            <tecnico tipo="redes">Raul Rabufeti</tecnico>
            <tecnico tipo="cloud">Francisco Eberredi</tecnico>
            <tecnico tipo="teleco">Juan Carabán</tecnico>
            <tecnico tipo="tienda">Raul Gandolfi</tecnico>
        </tecnicos>
    </empleados>
    <tienda>
        <tecnicos>
            <tecnico>Roberto Cinyapies</tecnico>
            <tecnico>Antonio Martinez</tecnico>
            <tecnico>Pepe Pintamonas</tecnico>
        </tecnicos>
    </tienda>
    <departamentos>
        <pc>HP1</pc>
        <pc>HP2</pc>
        <pc>HP3</pc>

        <trabajador>Johan Lopez</trabajador>
        <trabajador>Jose Luis Gilberto</trabajador>
        <trabajador>Mario del Monte Quemado</trabajador>

        <tecnico>Hernesto Arreglatodo</tecnico>
    </departamentos>
    <oficinas>
        <jefe tipo="ceo">Cabroncito Ortega</jefe>
        <pc>Packard Bell 1</pc>
        <pc>Packard Bell 2</pc>
        <secretario>Pelotas Gil</secretario>
    </oficinas>
    <servicios>
        <nube>Cloud Computing</nube>
        <redes>Instalación de Redes</redes>
            <velocidad valor="300">300Mbps</velocidad>
            <velocidad valor="100">100Mbps</velocidad>
        <teleco>Antenas instalacion y mantenimiento</teleco>
        <hosting>Hosting Web</hosting>
            <almacenamiento tipo="normal">5GB</almacenamiento>
            <almacenamiento tipo="premium">10GB</almacenamiento>
        <servidores>Servidores centralizados</servidores>
            <servidor>IBM1</servidor>
            <servidor>IBM2</servidor>
        <presupuesto_coste>
            <montaje>25</montaje>
            <coste>15</coste>
        </presupuesto_coste>

        <componentes>
            <componente>
                <nombre>Grafica</nombre>
                <modelo>GTX 1050</modelo>
                <precio>150?</precio>
                <marca>Nvidia</marca>
            </componente>
            <componente>
                <nombre>Pantalla</nombre>
                <modelo>700</modelo>
                <precio>100?</precio>
                <marca>Aoc</marca>
            </componente>
            <componente>
                <nombre>Teclado y ratón</nombre>
                <modelo>564</modelo>
                <precio>35?</precio>
                <marca>Logitech</marca>
            </componente>
            <componente>
                <nombre>Torre</nombre>
                <modelo>795</modelo>
                <precio>600?</precio>
                <marca>Packard Bell</marca>
            </componente>
        </componentes>

        <presupuestos>
            <presupuesto tipo="alto">Gaming</presupuesto>
            <presupuesto tipo="medio">Basic</presupuesto>
            <presupuesto tipo="bajo">Low cost</presupuesto>
        </presupuestos>

    </servicios>
    <jefes>
        <jefe tipo="ceo">Jefe Master Pinche</jefe>
        <jefe tipo="ventas">Tolovendo Alegrez</jefe>
        <jefe tipo="marqueting">Compramelo Rapidez</jefe>
    </jefes>

    <clientes>
        <cliente codigo="x_01">Jose Luís</cliente>
        <cliente codigo="x_02">Jonh Petter</cliente>
        <cliente codigo="x_03">Kim Kardasian</cliente>
    </clientes>
</empresa>

DTD 代码:

<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT empresa (empleados,tienda,departamentos,oficinas,servicios,jefes,clientes)>
<!ELEMENT clientes (cliente*)>
<!ELEMENT cliente (#PCDATA)>
<!ELEMENT empleados (oficinistas,tecnicos)>
<!ELEMENT oficinistas (oficinista+)>
<!ELEMENT oficinista (#PCDATA)>
<!ELEMENT tecnicos (tecnico+)>
<!ELEMENT tecnico (#PCDATA)>
<!ATTLIST tecnico tipo CDATA #IMPLIED>
<!ELEMENT tienda (tecnicos+)>
<!ELEMENT departamentos (pc+,trabajador+,tecnico+)>
<!ELEMENT trabajador (#PCDATA)>
<!ELEMENT tabajadores (trabajador+)>
<!ELEMENT trabajadores (#PCDATA)>
<!ELEMENT pc (#PCDATA)>
<!ELEMENT oficinas (jefe,pc+,secretario)>
<!ATTLIST jefe tipo CDATA #IMPLIED>
<!ELEMENT jefe (#PCDATA)>
<!ELEMENT secretario (#PCDATA)>
<!ELEMENT servicios (nube,redes,teleco,hosting,servidores,presupuesto_coste,componentes,presupuestos)>
<!ELEMENT nube (#PCDATA)>
<!ELEMENT redes (#PCDATA)>
<!ELEMENT teleco (#PCDATA)>
<!ATTLIST velocidad valor (100|300) #REQUIRED>
<!ATTLIST conexion tipo (fibra|cobre) #REQUIRED>
<!ELEMENT conexion (tipo,velocidad)>
<!ELEMENT tipo (#PCDATA)>
<!ELEMENT velocidad (#PCDATA)>
<!ELEMENT hosting (almacenamiento+)>
<!ELEMENT almacenamiento (#PCDATA)>
<!ATTLIST almacenamiento tipo (normal|premium) #REQUIRED>
<!ELEMENT servidores (servidor+)>
<!ELEMENT servidor (#PCDATA)>
<!ELEMENT presupuesto_coste (montaje,coste)>
<!ELEMENT montaje (#PCDATA)>
<!ELEMENT coste (#PCDATA)>
<!ELEMENT componentes (componente+)>
<!ELEMENT componente (nombre,modelo,precio,marca)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT modelo (#PCDATA)>
<!ELEMENT precio (#PCDATA)>
<!ELEMENT marca (#PCDATA)>
<!ATTLIST componentes tipo (normal|gaming) #IMPLIED>
<!ELEMENT presupuestos (presupuesto+)>
<!ELEMENT presupuesto (#PCDATA)>
<!ATTLIST presupuesto tipo (alto|medio|bajo) #REQUIRED>
<!ATTLIST presupuesto precio (500|700|1000) #IMPLIED>
<!ELEMENT jefes (jefe+)>
<!ATTLIST jefe ceo CDATA #IMPLIED>
<!ATTLIST jefe ventas CDATA #IMPLIED>
<!ATTLIST jefe marqueting CDATA #IMPLIED>
<!ATTLIST cliente codigo ID #REQUIRED>

并且错误,都必须匹配,为什么验证器在我不明白的“()”中显示“+”符号,XML 验证正确:

48: 39  The content of element type "hosting" must match "(almacenamiento)+".
    51: 58  The content of element type "servidores" must match "(servidor)+".
    92: 17  The content of element type "servicios" must match "(nube,redes,teleco,hosting,servidores,presupuesto_coste,componentes,presupuestos)".

标签: xmldtd

解决方案


此 DTD 声明

<!ELEMENT hosting (almacenamiento+)>

表示<hosting>元素的内容模型是一个或多个<almacenamiento>元素。所以 XML 文件应该如下所示:

<hosting>
    <almacenamiento tipo="normal">5GB</almacenamiento>
    <almacenamiento tipo="premium">10GB</almacenamiento>
</hosting>

相同的结构适用于

<!ELEMENT servidores (servidor+)>

<servidores>
    <servidor>IBM1</servidor>
    <servidor>IBM2</servidor>
</servidores>

最后一个错误与此 DTD 语句相关联:

<!ELEMENT servicios (nube,redes,teleco,hosting,servidores,presupuesto_coste,componentes,presupuestos)>

<servicios>元素必须由列表中每个元素的一次出现组成,按确切顺序,没有可选元素。但是,XML 文档包含两个<velocidad>元素,这是不允许的。

<servicios>
    <nube>Cloud Computing</nube>
    <redes>Instalación de Redes</redes>
        <velocidad valor="300">300Mbps</velocidad>
        <velocidad valor="100">100Mbps</velocidad>
    <teleco>Antenas instalacion y mantenimiento</teleco>
    <hosting>Hosting Web</hosting>

但这里变得棘手,因为根据 DTD,<velocidad>元素应该包含在元素中:<conexion>

<!ELEMENT conexion (tipo,velocidad)>
<!ATTLIST conexion tipo (fibra|cobre) #REQUIRED>
<!ATTLIST velocidad valor (100|300) #REQUIRED>
<!ELEMENT tipo (#PCDATA)>
<!ELEMENT velocidad (#PCDATA)>

但是,> 没有父元素<conexion,因此它不能成为根元素为 的任何有效 XML 文档的一部分<empresa>


推荐阅读