views:

67

answers:

3

Is it possible to validate the following xml with the following schema? I'd like to validate the xml without specifying the schema in the xml file.

I'm not sure if this is possible or not, but would appreciate some help figuring out how to do it.

I keep getting the following error when I attempt to validate the 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>

Java Code I'm using to do the 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();
        }
A: 

http://www.edankert.com/apis/jaxp.document-builder-factory.schema-validation.html

factory.setValidating(true)

edit -- never mind, i didnt see the "without specifying the schema" in my first read ;)

hvgotcodes
+2  A: 

Could be an annoying namespace problem. The element contact is defined in namespace http://madeupdomain.com/xml/contacts but the actual contacts element in the xml document is in the default namespace.

This could already remove the error:

<contacts xmlns="http://madeupdomain.com/xml/contacts"&gt;
    <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>
Andreas_D
My question is can I validate the xml I posted using an xml schema without changing the xml file. When I make that change to the xml file it does validate.
ScArcher2
You already have the dom - just visit all elements and set the element's namespaces to `http://madeupdomain.com/xml/contacts`. That should work too. The element node `contacts` has to be in the correct namespace before you validate the document.
Andreas_D
+1  A: 

You can modify XML Schema instead. Remove targetNamespace from schema.

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
   <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>
syntetic
That fixed it. Thanks!!
ScArcher2