How do I validate xml using an xml schema?
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();
}
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">
<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>
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">
<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>
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 ;)
精彩评论