2010-10-13 3 views
0

Je suis en train d'assembler du code de validation. Je suis en train de valider contre un schéma comme:Support javax.xml.parsers.DocumentBuilder pour les types complexes

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:choice="http://example.com/SimpleChoice" targetNamespace="http://example.com/SimpleChoice" ecore:nsPrefix="choice" ecore:package="com.example.simple.choice"> 
    <xsd:complexType name="Plane"> 
     <xsd:sequence> 
      <xsd:element name="freightDetails" type="xsd:string" minOccurs="0"/> 
      <xsd:element name="passengers" type="xsd:int" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Avec le code XML suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<choice:Plane xmlns:choice="http://example.com/SimpleChoice"> 
    <freightDetails>Boxes</freightDetails> 
</choice:Plane> 

Il semble se plaindre qu'il n'y a pas d'élément, mais je suis en train de trouver un moyen de valider contre le type. Je reçois l'erreur suivante:

[Error] :1:100: cvc-elt.1: Cannot find the declaration of element 'choice:Plane'. 

Quand il tente de charger le document avec le code suivant:

SchemaFactory factory = 
    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = factory.newSchema(schemaFile); 

DocumentBuilderFactory parserFactory = DocumentBuilderFactory.newInstance(); 
parserFactory.setSchema(schema); 
parserFactory.setNamespaceAware(true); 
DocumentBuilder parser = parserFactory.newDocumentBuilder(); 

Document document = parser.parse(inputSource); 

Validator validator = schema.newValidator(); 
validator.validate(new DOMSource(document)); 

Il échoue quand il arrive au:

Document document = parser.parse(inputSource); 

Quelqu'un at-il des idées sur la façon dont je serais en mesure de faire fonctionner cela? (Ou un validateur qui prend en charge ce genre de comportement?)

Merci

Rob

Répondre

1

Ceci est dû au fait que votre schéma a défini un type (Plane), mais n'a défini aucun élément autorisé utilisant ce type. Un type en lui-même n'a aucune signification en dehors du schéma lui-même. Vous devez ajouter un code <xsd:element> à votre schéma.

<xsd:element name="Plane"> 
    <xsd:complexType> 
    <xsd:sequence> 
     <xsd:element name="freightDetails" type="xsd:string" minOccurs="0"/> 
     <xsd:element name="passengers" type="xsd:int" minOccurs="0"/> 
    </xsd:sequence> 
    </xsd:complexType>  
</xsd:element> 
+0

Merci pour la suggestion, j'ai essayé des cas où il y avait un élément auparavant et ils fonctionnent en effet. Cependant, j'ai un cas où je veux valider contre le type et j'espérais qu'il y avait une façon dont cela était supporté. – Rob

+0

@RobL: Non, ce n'est pas comme ça que fonctionne XML Schema. Vous validez les éléments, pas les types. – skaffman

0

Dans votre exemple schéma, vous avez seulement défini un de type nommé Plane, pas un élément nommé Plane. Ajoutez une déclaration d'élément à votre schéma et voyez ce qui se passe ...

+0

Merci pour la suggestion, j'ai essayé des cas où il y avait un élément précédemment et ils ne fonctionnent en effet: l'intérieur de ce, quelque chose comme solution la plus simple est d'utiliser un type complexe anonyme. Cependant, j'ai un cas où je veux valider contre le type et j'espérais qu'il y avait une façon de le supporter – Rob

Questions connexes