2009-10-01 4 views
0

j'utilise Xerces pour valider une instance xml contre le schéma:élément enfants avec préfixe d'espace de noms ont été considérés comme non valides par xerces

parser.setFeature("http://xml.org/sax/features/namespaces", true); 
parser.setFeature("http://xml.org/sax/features/namespace-prefixes", true); 
parser.setFeature("http://xml.org/sax/features/validation", true); 
parser.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation", 
     schemaLocation); 
parser.setFeature("http://apache.org/xml/features/validation/schema", true); 
parser.parse(new InputSource(xml)); 

Voici mon exemple xml:

<?xml version="1.0"?> 
<eml:eml packageId="tao.12926.1" system="knb" xmlns:eml="eml://ecoinformatics.org/eml-2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eml://ecoinformatics.org/eml-2.1.0 eml.xsd"> 
    <dataset> 
    ....... 
    </dataset> 
</eml:eml> 

Ce fichier XML est considéré comme valide.

Cependant, si j'ajouté le préfixe "EML" à l'élément "jeu de données":

<?xml version="1.0"?> 
<eml:eml packageId="tao.12926.1" system="knb" xmlns:eml="eml://ecoinformatics.org/eml-2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eml://ecoinformatics.org/eml-2.1.0 eml.xsd"> 
    <eml:dataset> 
    ....... 
    </eml:dataset> 
</eml:eml> 

Il me donne une erreur: cvc-type.2.4.a-complexe: contenu non valide en commençant par l'élément « EML : ensemble de données '. Le contenu doit correspondre à '((("": access) {0-1}, (((("": dataset) | ("": citation)) | ("": software)) | ("": protocole))), ("": additionalMetadata) {0-UNBOUNDED}) '.

Je ne pouvais pas comprendre cela. "dataset" a par défaut l'espace de noms au cours de notre définition de schéma. "dataset" juste une version abrégée de "eml: dataset". Pourquoi xerces n'aime pas?

Pourriez-vous me donner quelques indices?

Merci!

+0

L'élément de dataset est dans l'espace de noms nul, ce qui vous fait penser autrement – Alohci

Répondre

1

Je pense que tout analyseur, pas seulement xerces, signalerait une erreur concernant eml: dataset. La raison en est que le schéma pour eml: eml n'utilise pas l'attribut elementFormDefault, qui par défaut est "non qualifié", ce qui nécessite que les noms de "éléments localement déclarés" (tels que dataset) ne reçoivent pas de préfixe (ou un espace de noms implicite au moyen de l'espace de noms par défaut). Seuls les éléments globaux (tels qu'eml, ici) peuvent avoir (en fait, nécessitent) un préfixe d'espace de nommage explicite. Pour autoriser (ou peut-être même exiger) que les éléments localement déclarés soient préfixés, il faudrait modifier le schéma, soit en ajoutant la paire attributFormDefault = "qualifiée" attribut-valeur à la déclaration de l'élément global sous-jacent, ou en ajoutant un attribut form = "qualified" à des éléments individuels déclarés localement du schéma (dataset, par exemple).

Tout cela, et puis certains!, Est expliqué dans la section 3.1, 3.2 du W3C Schema Primer document.

+0

Merci mjv J'ai essayé le chemin que vous avez suggéré mais toujours l'erreur: cvc-complex-type.2.4.a: Contenu invalide commençant par l'élément 'emlds: dataset' – Jing

+0

@Jing J'étais complètement hors de mon évaluation que l'ensemble de données aurait dû former un autre namespace. XSD trop rapide ... La cible NS dans le XSD est effectivement "eml: //ecoinformatics.org/eml-2.1.0", les autres espaces de noms dans ecoinformatics.org sont pour les types, mais les éléments eux-mêmes ont le " eml "NS.Maintenant, je pense que je sais pourquoi nous ne pouvons pas ajouter le préfixe eml à des éléments comme un ensemble de données, c'est à cause de la façon dont les "éléments localement déclarés" sont configurés dans le XSD. Voir ma réponse éditée. – mjv

1

J'ai été en mesure de résoudre mon problème en utilisant votre suggestion. J'ai déclaré mon élément comme suit:

<xs:element name="GradeHigh" type="xs:string" form="qualified" /> 

J'ai alors pu mettre le préfixe d'espace de noms sur cet élément dans le document XML.

   <sch:Grades> 
        <sch:GradeHigh/> 

est maintenant valide. Plus tôt, sans le "form =" qualifié "Je obtiendrais une erreur de validation sur le xml ci-dessus

Questions connexes