2010-03-25 20 views
0

J'essaie d'utiliser dom4j pour valider le XML à http://www.w3schools.com/Schema/schema_example.asp en utilisant le xsd de cette même page. Il échoue avec l'erreur suivante:L'exemple w3schools xsd ne fonctionnera pas avec dom4j. Comment utiliser dom4j pour valider xml en utilisant xsds?

org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'shiporder'. 

J'utilise le code suivant:

SAXReader reader = new SAXReader(); 
reader.setValidation(true); 
reader.setFeature("http://apache.org/xml/features/validation/schema", true); 
reader.setErrorHandler(new XmlErrorHandler()); 
reader.read(in); 

où, en est un InputStream et XmlErrorHandler est une classe simple qui se connecte simplement toutes les erreurs.

J'utilise le fichier XML suivant:

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

<shiporder orderid="889923" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="test1.xsd"> 
    <orderperson>John Smith</orderperson> 
    <shipto> 
    <name>Ola Nordmann</name> 
    <address>Langgt 23</address> 
    <city>4000 Stavanger</city> 
    <country>Norway</country> 
    </shipto> 
    <item> 
    <title>Empire Burlesque</title> 
    <note>Special Edition</note> 
    <quantity>1</quantity> 
    <price>10.90</price> 
    </item> 
    <item> 
    <title>Hide your heart</title> 
    <quantity>1</quantity> 
    <price>9.90</price> 
    </item> 
</shiporder> 

et le xsd correspondant:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:simpleType name="stringtype"> 
    <xs:restriction base="xs:string"/> 
</xs:simpleType> 

<xs:simpleType name="inttype"> 
    <xs:restriction base="xs:positiveInteger"/> 
</xs:simpleType> 

<xs:simpleType name="dectype"> 
    <xs:restriction base="xs:decimal"/> 
</xs:simpleType> 

<xs:simpleType name="orderidtype"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[0-9]{6}"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:complexType name="shiptotype"> 
    <xs:sequence> 
    <xs:element name="name" type="stringtype"/> 
    <xs:element name="address" type="stringtype"/> 
    <xs:element name="city" type="stringtype"/> 
    <xs:element name="country" type="stringtype"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="itemtype"> 
    <xs:sequence> 
    <xs:element name="title" type="stringtype"/> 
    <xs:element name="note" type="stringtype" minOccurs="0"/> 
    <xs:element name="quantity" type="inttype"/> 
    <xs:element name="price" type="dectype"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="shipordertype"> 
    <xs:sequence> 
    <xs:element name="orderperson" type="stringtype"/> 
    <xs:element name="shipto" type="shiptotype"/> 
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/> 
    </xs:sequence> 
    <xs:attribute name="orderid" type="orderidtype" use="required"/> 
</xs:complexType> 

<xs:element name="shiporder" type="shipordertype"/> 

</xs:schema> 

Le xsd et le fichier XML sont dans le même répertoire. Quel est le problème?

+0

Il n'y a rien de mal. Comment construisez-vous votre flux d'entrée pour reader.read (in); –

Répondre

1

Je soupçonne que c'est à cause de cela:

reader.read(in); 

Vous n'êtes pas donner au lecteur un contexte à où le flux d'entrée vient, il ne peut pas résoudre le schéma. Essayez plutôt de faire passer le lecteur quelque chose comme un objet File ou URL, quelque chose qu'il peut utiliser pour générer une référence relative au schéma.