2010-07-15 8 views
3

Est-il possible de valider le fichier XML suivant avec le schéma suivant? Je voudrais valider le fichier XML sans spécifier le schéma dans le fichier xml.Comment valider xml en utilisant un schéma XML?

Je ne sais pas si c'est possible ou non, mais j'apprécierais de l'aide pour trouver comment le faire.

Je continue d'obtenir l'erreur suivante lorsque je tente de valider le fichier XML.

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

<?xml version="1.0" ?> 
<contacts> 
    <contact> 
     <names>Joe Buddah</names> 
     <address>123 Black Jack Cove</address> 
     <phone>555-555-1212</phone> 
    </contact> 
    <contact> 
     <name>Ray Buddah</name> 
     <address>123 Black Jack Cove</address> 
     <phone>555-555-1212</phone> 
    </contact> 
</contacts> 

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://madeupdomain.com/xml/contacts" xmlns:tns="http://madeupdomain.com/contacts" elementFormDefault="qualified"> 
    <complexType name="contactType"> 
     <sequence> 
      <element name="name" type="string" maxOccurs="1" minOccurs="1"></element> 
      <element name="address" type="string"></element> 
      <element name="phone" type="string"></element> 
     </sequence> 
    </complexType> 
    <complexType name="contactsType"> 
     <sequence> 
      <element name="contact" type="tns:contactType" minOccurs="0" maxOccurs="unbounded"></element> 
     </sequence> 
    </complexType> 
    <element name="contacts" type="tns:contactsType"></element> 
</schema> 

Code Java J'utilise pour faire la validation.

static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; 

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException 
    { 
     DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
     documentBuilderFactory.setNamespaceAware(true); 
     documentBuilderFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File("src/main/resources/contacts.xsd")); 

     // parse an XML document into a DOM tree 
     DocumentBuilder parser = documentBuilderFactory.newDocumentBuilder(); 

     Document document = parser.parse(new File("src/main/resources/contacts.xml")); 

     // create a SchemaFactory capable of understanding WXS schemas 
     SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

     // load a WXS schema, represented by a Schema instance 
     Source schemaFile = new StreamSource(new File("src/main/resources/patient.xsd")); 
     Schema schema = factory.newSchema(schemaFile); 

     // create a Validator instance, which can be used to validate an instance document 
     Validator validator = schema.newValidator(); 

     // validate the DOM tree 
     try 
     { 
      validator.validate(new DOMSource(document)); 
     } 
     catch (SAXException e) 
     { 
      e.printStackTrace(); 
     } 

Répondre

2

Vous pouvez modifier le schéma XML à la place. Supprimez targetNamespace du schéma.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="contactType"> 
     <xsd:sequence> 
     <xsd:element name="name" type="xsd:string" maxOccurs="1" minOccurs="1"/> 
     <xsd:element name="address" type="xsd:string"/> 
     <xsd:element name="phone" type="xsd:string"/> 
    </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="contactsType"> 
     <xsd:sequence> 
     <xsd:element name="contact" type="contactType" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:element name="contacts" type="contactsType"/> 
</xsd:schema> 
+0

Cela l'a corrigé. Merci!! – ScArcher2

2

Peut-être un problème d'espace de noms ennuyeux. L'élément contact est défini dans l'espace de noms http://madeupdomain.com/xml/contacts mais l'élément réel contacts dans le document XML se trouve dans l'espace de noms par défaut.

Cela pourrait déjà supprimer l'erreur:

<contacts xmlns="http://madeupdomain.com/xml/contacts"> 
    <contact> 
     <names>Joe Buddah</names> 
     <address>123 Black Jack Cove</address> 
     <phone>555-555-1212</phone> 
    </contact> 
    <contact> 
     <name>Ray Buddah</name> 
     <address>123 Black Jack Cove</address> 
     <phone>555-555-1212</phone> 
    </contact> 
</contacts> 
+1

Ma question est puis-je valider le xml que j'ai posté en utilisant un schéma xml sans changer le fichier xml. Lorsque je fais cette modification dans le fichier xml, il valide. – ScArcher2

+1

Vous avez déjà le dom - juste visiter tous les éléments et définir les espaces de noms de l'élément à 'http: // madeupdomain.com/xml/contacts'. Cela devrait fonctionner aussi. Le noeud d'élément 'contacts' doit se trouver dans l'espace de nom correct avant de valider le document. –

Questions connexes