xml - 元素必须匹配 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)".
解决方案
此 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>
。
推荐阅读
- android - com.android.volley.RequestQueue.add(com.android.volley.Request)' 在空对象引用上。如何使用 volley 解析 json?
- angular - 如何对组件进行单元测试以检查特定组件是否已呈现
- python - 如何解决 PyLint 错误:当我的语法全部正确时语法无效
- flutter - Flutter:如何停止播放声音
- python - 按行重新格式化数据框
- python - 熊猫的数据框在我的代码中不起作用
- database-design - MariaDB 一行内有多个主键或值
- php - 有 Laravel 8 路由和控制器问题
- javascript - 图表js饼图数据集数据的问题
- octave - Octave(GUI):一次性清除工作环境的所有变量