2010-11-02 7 views
2

XSDXML Validation XSD échoue

<?xml version="1.0" encoding="windows-1252"?> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://xml.netbeans.org/schema/Person" 
    xmlns:tns="http://xml.netbeans.org/schema/Person" 
    elementFormDefault="qualified"> 
    <xsd:element name="root"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="persons"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="person" maxOccurs="unbounded"> 
           <xsd:complexType> 
            <xsd:sequence> 
             <xsd:element name="name" type="xsd:string"></xsd:element> 
             <xsd:element name="age" type="xsd:int"></xsd:element> 
             <xsd:element name="address" type="xsd:string"></xsd:element> 
            </xsd:sequence> 
           </xsd:complexType> 
          </xsd:element> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema>  

fichier XML

<root> 
    <persons> 
    <person> 
     <name>name1</name> 
     <age>1</age> 
     <address>abc abc abc1</address> 
    </person> 
    <person> 
     <name>name2</name> 
     <age>2</age> 
     <address>abc abc abc2</address> 
    </person> 
    <person> 
     <name>name2</name> 
     <age>3</age> 
     <address>abc abc abc3</address> 
    </person> 
    </persons> 
</root> 
code

qui valide XML contre XSD:

public static String validateXMLwithXSD(String xmlFile, String xsdFile) { 
     String result = "SUCCESS"; 
     try { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      System.out.println("DocumentBuilderFactory: " + factory.getClass().getName()); 
      factory.setNamespaceAware(true); 
      factory.setValidating(true); 
      factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); 
      // Specify our own schema - this overrides the schemaLocation in the xml file 
      factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", "d:\\person.xsd"); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      builder.setErrorHandler(new SimpleErrorHandler()); 
      Document document = builder.parse(xmlFile); 
      Node rootNode = document.getFirstChild(); 
      System.out.println("Root node: " + rootNode.getNodeName()); 
     } catch (Exception ex) { 
      System.out.println("--------------------"); 
      result = "FAILURE:" + ex.getMessage(); 
      ex.printStackTrace(); 
     }catch (Error ex) { 
      System.out.println("--------------------"); 
      result = "FAILURE:" + ex.getMessage(); 
      ex.printStackTrace(); 
     } 

     return result; 

    } 

Il jette

DocumentBuilderFactory: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'root'. 
     at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 

Mise à jour: Après la réponse

[exec:exec] 
DocumentBuilderFactory: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 
org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'persons'. One of '{"http://xml.netbeans.org/schema/Person":persons}' is expected. 
     at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 


error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'persons'. One of '{"http://xml.netbeans.org/schema/Person":persons}' is expected. 

Répondre

1

David's answer est correct sur la qualification d'espace de noms, votre XML devrait ressembler à:

<root xmlns="http://xml.netbeans.org/schema/Person"> 
    <persons> 
    <person> 
     <name>name1</name> 
     <age>1</age> 
     <address>abc abc abc1</address> 
    </person> 
    <person> 
     <name>name2</name> 
     <age>2</age> 
     <address>abc abc abc2</address> 
    </person> 
    <person> 
     <name>name2</name> 
     <age>3</age> 
     <address>abc abc abc3</address> 
    </person> 
    </persons> 
</root> 

Même avec un schéma XML correct, je vu cette erreur si l'analyseur ne peut pas rechercher le schéma XML correctement. La méthode que vous utilisez est assez ancienne. Si vous utilisez Java SE 5 ou version ultérieure, vous pouvez utiliser le code suivant pour effectuer la validation lors de l'analyse d'un document XML:

import java.io.File; 
import javax.xml.XMLConstants; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.validation.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = sf.newSchema(new File("person.xsd")); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     dbf.setSchema(schema); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     db.parse(new File("person.xml")); 
    } 
} 
3

Davis L'espace de noms cible pour votre schéma est http://xml.netbeans.org/schema/Person, mais le xml échantillon n'est pas dans un espace de noms à tous. Probablement vous voulez quelque chose comme:

<p:root xmlns:p="http://xml.netbeans.org/schema/Person"> 
... 
</p:root> 
+0

Merci, mais encore des erreurs, mises à jour e question –

+1

Avez-vous ajouté le p: à tous les éléments? Il doit être partout, pas seulement sur la racine. C'est ce que le targetNamespace = "http://xml.netbeans.org/schema/Person" signifie. –

+0

+1, mais techniquement c'est une combinaison de targetNamespace et de elementFormDefault = "qualifié" qui nécessite que tous les nœuds soient qualifiés pour l'espace de noms. Si elementFormDefault est défini sur "non qualifié" (ou non défini), seuls les éléments déclarés globalement doivent être préfixés (uniquement "root" dans ce cas). –

1

Comme David dit, mais vous devez ajouter l'espace de noms à tous les tags.

Soit

<p:root xmlns:p="http://xml.netbeans.org/schema/Person"> 
    <p:persons> 
    <p:person> 
    ... 
    </p:person> 
    <p:persons> 
</p:root> 

Ou

<root xmlns="http://xml.netbeans.org/schema/Person"> 
    <persons> 
     ... 
    </persons> 
</root> 
+0

+1 Pour la déclaration d'espace de noms par défaut. –