元素必须在XML +(DTD)上声明

时间:2019-05-31 09:59:34

标签: xml dtd

验证者说有未声明的元素 它不会在dtd上进行验证,但会在dtd上声明。

我尝试使用xml验证程序网站和XML复制编辑器对其进行验证。

这是XML代码:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE empresa SYSTEM ".\empresa.dtd">
<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 Caraban</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>
        <pcs>
            <pc>HP1</pc>
            <pc>HP2</pc>
            <pc>HP3</pc>
        </pcs>

        <trabajadores>
        <trabajador>Johan Lopez</trabajador>
        <trabajador>Jose Luis Gilberto</trabajador>
        <trabajador>Mario del Monte Quemado</trabajador>
        </trabajadores>
        <tecnico>Hernesto Arreglatodo</tecnico>
    </departamentos>
    <oficinas>
        <jefe>Cabroncito Ortega</jefe>
        <pcs>Packard Bell 1</pcs>
        <pcs>Packard Bell 2</pcs>
        <secretario>Pelotas Gil</secretario>
    </oficinas>
    <servicios>
        <nube>Cloud Computing</nube>
        <redes>Instalacion de Redes</redes>
            <velocidad valor="300">300Mbps</velocidad>
            <velocidad valor="100">100Mbps</velocidad>
        <teleco>Antenas instalacion y mantenimiento</teleco>
        <hosting>Hosting Web</hosting>
            <almacenamiento valor="normal">5GB</almacenamiento>
            <almacenamiento valor="premium">10GB</almacenamiento>
        <servidores>Servidores centralizados</servidores>
            <servidor>IBM1</servidor>
            <servidor>IBM2</servidor>
        <presupuesto>
            <montaje>25</montaje>
            <coste>15</coste>
        </presupuesto>
        <componentes>
            <componente>Graficas</componente>
            <componente>RAM</componente>
            <componente>CPU</componente>
            <componente>Pantallas</componente>
            <componente>Teclados</componente>
            <componente>Ratones</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" precio="">Jefe Master Pinche</jefe>
        <jefe tipo="ventas" precio="">Tolovendo Alegrez</jefe>
        <jefe tipo="marqueting" precio="">Compramelo Rapidez</jefe>
    </jefes>

    <clientes>
        <cliente codigo="1">Jose Luis</cliente>
        <cliente codigo="2">Jonh Petter</cliente>
        <cliente codigo="3">Kim Kardasian</cliente>
    </clientes>
</empresa>

DTD代码:

<?xml version="1.0" encoding="ISO-8859-1"?>

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

和错误: 奇怪的是,验证器对格式正确的XML存有疑问

4:  16  Element type "empleados" must be declared.
5:  22  Element type "oficinistas" must be declared.
6:  23  Element type "oficinista" must be declared.
7:  23  Element type "oficinista" must be declared.
9:  19  Element type "tecnicos" must be declared.
10: 33  Element type "tecnico" must be declared.
11: 33  Element type "tecnico" must be declared.
12: 34  Element type "tecnico" must be declared.
13: 34  Element type "tecnico" must be declared.
16: 13  Element type "tienda" must be declared.
17: 13  Element type "tecnicos" must be declared.
18: 13  Element type "tecnico" must be declared.
19: 13  Element type "tecnico" must be declared.
20: 13  Element type "tecnico" must be declared.
23: 20  Element type "departamentos" must be declared.
24: 8   Element type "pcs" must be declared.
25: 8   Element type "pc" must be declared.
26: 8   Element type "pc" must be declared.
27: 8   Element type "pc" must be declared.
30: 17  Element type "trabajadores" must be declared.
31: 21  Element type "trabajador" must be declared.
32: 21  Element type "trabajador" must be declared.
33: 21  Element type "trabajador" must be declared.
35: 18  Element type "tecnico" must be declared.
37: 15  Element type "oficinas" must be declared.
38: 15  Element type "jefe" must be declared.
39: 14  Element type "pcs" must be declared.
40: 8   Element type "pcs" must be declared.
41: 21  Element type "secretario" must be declared.
43: 16  Element type "servicios" must be declared.
44: 15  Element type "nube" must be declared.
45: 16  Element type "redes" must be declared.
46: 27  Element type "velocidad" must be declared.
47: 27  Element type "velocidad" must be declared.
48: 17  Element type "teleco" must be declared.
49: 18  Element type "hosting" must be declared.
50: 35  Element type "almacenamiento" must be declared.
51: 36  Element type "almacenamiento" must be declared.
52: 21  Element type "servidores" must be declared.
53: 14  Element type "servidor" must be declared.
54: 14  Element type "servidor" must be declared.
55: 16  Element type "presupuesto" must be declared.
56: 13  Element type "montaje" must be declared.
57: 11  Element type "coste" must be declared.
59: 16  Element type "componentes" must be declared.
60: 16  Element type "componente" must be declared.
61: 16  Element type "componente" must be declared.
62: 16  Element type "componente" must be declared.
63: 16  Element type "componente" must be declared.
64: 16  Element type "componente" must be declared.
65: 16  Element type "componente" must be declared.
67: 23  Element type "presupuestos" must be declared.
68: 29  Element type "presupuesto" must be declared.
69: 30  Element type "presupuesto" must be declared.
70: 29  Element type "presupuesto" must be declared.
74: 12  Element type "jefes" must be declared.
75: 36  Element type "jefe" must be declared.
76: 39  Element type "jefe" must be declared.
77: 43  Element type "jefe" must be declared.
80: 12  Element type "clientes" must be declared.
81: 23  Element type "cliente" must be declared.
82: 23  Element type "cliente" must be declared.
83: 23  Element type "cliente" must be declared.

1 个答案:

答案 0 :(得分:0)

此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没有父元素,因此它不能成为根元素为<empresa>的任何有效XML文档的一部分。