2012-05-04 23 views
6

creé la siguiente XSD (con Eclipse):Error de validación XSD: Elemento '{http://www.example.com} Ámbito': no ​​se espera este elemento. Esperado es (Alcance)

<?xml version="1.0" encoding="UTF-8"?> 
    <schema targetNamespace="http://www.example.com" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com"> 
    <element name="Make"> 
     <complexType> 
     <sequence> 
      <element name="Scope"></element> 
     </sequence> 
     </complexType> 
    </element> 
    </schema> 

y validar con este sencillo XML

<?xml version="1.0"?> 
    <Make xmlns="http://www.example.com"> 
    <Scope> 
    </Scope> 
    </Make> 

da:

xmllint.exe --noout --schema sources.xsd sources.xml 
    sources.xml:3: element Scope: Schemas validity error : Element '{http://www.example.com}Scope': This element is not expected. Expected is (Scope). 
    sources.xml fails to validate 

En mi opinión, esto debe ser correcto: el archivo XML está en el espacio de nombres http://www.example.com (lo que también dice el validador) .

Y para el XSD configuré el espacio de nombres predeterminado para el esquema XSD (esto es lo que hace Eclipse, ¡así que debería ser correcto!) Y doy el targetNamespace correcto. También traté de usar

<element name="tnd:Scope" /> 

Sin embargo, esto tampoco funciona.

¿Esto es un error en xmllint o dónde está el problema?

Saludos divB

+0

Typo? 'tnd: Scope' debe ser' tns: Scope' – Filburt

Respuesta

3

Una alternativa a @dbasemans respuesta sería para especificar el elementFormDefault como cualificado:

<schema targetNamespace="http://www.example.com" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://www.example.com" 
    elementFormDefault="qualified"> 

Utilizando el xsd o xs prefijo para su espacio de nombres de esquema podría considerarse común, por lo que puede elegir modificar su esquema como sugerido por dbaseman.

+0

¡Hola, gracias (a los dos)! La única cosa que no entiendo entonces: ¿Para qué necesito targetNamespace entonces? – divB

+0

En realidad, su respuesta es correcta (+1) en comparación con la otra, lo cual es incorrecto. Sin embargo, mucha gente argumentaría que el 'xsd' podría considerarse como un prefijo estándar; en su lugar, usaría" common ". De hecho, 'xs' es el definido en la [DTD] (http://www.w3.org/2001/XMLSchema.dtd) que normalmente acompaña al XSD para XSD ... –

+1

@divB Aún necesita ** targetNamespace ** a menos que desee ocultar (localizar) el espacio de nombres * http: //www.example.com* en el documento de instancia. – McGarnagle

2

usted tiene que fijar tanto el targetNamespace y el espacio de nombres XSD raíz en el mismo valor, si no desea especificar ningún calificador en el archivo XML para ser validado. Por lo que tendría que ser:

<schema targetNamespace="http://www.example.com" xmlns="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

Pero entonces, por supuesto, usted tiene que calificar los elementos XSD con xsd :. En otras palabras, para que su archivo XML de validación tal como está, que había necesidad de escribir el esquema como éste:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com"> 
    <xsd:element name="Make"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Scope"></xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Consulte aquí para obtener más información: http://www.xfront.com/DefaultNamespace.pdf

EDITAR Gracias a PetruGardea por señalar el error. Como la respuesta de Filbert implica, elementFormDefault es no calificado de forma predeterminada, lo que significa que se supone que los documentos de instancia están en el espacio de nombres de destino. Así que la respuesta de la avellana se correct-- la única alternativa sería la de hacer que todo sea anónima, omitiendo targetNamespace y dejando elementFormDefault como sin reservas, y luego retirar la refernce espacio de nombres del documento de instancia por completo.

Aquí es un buen desglose de lo que hace elementFormDefault: http://www.xfront.com/HideVersusExpose.html

+0

Desafortunadamente, su respuesta no tiene nada que ver con la pregunta; no hay problema con el XSD, y lo que está proponiendo no es cambiar el esquema de ninguna manera; su XSD actualizado no cambia el resultado de validar el XML propuesto. –

1

He encontrado otra solución a este problema, si no puede o no quiere cambiar el XSD. El siguiente XML se ajusta a su XSD:

<?xml version="1.0"?> 
<tns:Make xmlns:tns="http://www.example.com"> 
    <Scope> 
    </Scope> 
</tns:Make> 

Si elementFormDefault se establece en no calificado, tiene que definir el espacio de nombres para los elementos globales y no se debe definir el espacio de nombres para los elementos locales. Los elementos globales son aquellos directamente debajo del elemento de esquema en el XSD y los elementos locales son los anidados en otros elementos. Su error se debe a que define el espacio de nombre para el elemento local Scope utilizando un espacio de nombres predeterminado.

Hay más explicaciones en http://www.oracle.com/technetwork/articles/srivastava-namespaces-092580.html.

Cuestiones relacionadas