import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.StringReader; import java.io.StringWriter; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import javax.xml.validation.ValidatorHandler; import org.apache.commons.betwixt.io.BeanWriter; import org.jdom.Document; import org.jdom.input.SAXBuilder; import org.jdom.output.SAXOutputter; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.JDomDriver; public class SchemaParser { public static void main(String[] args) { // xsd validation directly against xml, works fine try { final String sl = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory factory = SchemaFactory.newInstance(sl); StreamSource ss = new StreamSource("mySchema2.xsd"); Schema schema = factory.newSchema(ss); Validator v = schema.newValidator(); v.validate(new StreamSource("testXml2.xml")); System.out.println("TEST 1: XML VALIDATION PASSED\n"); } catch (Exception e) { e.printStackTrace(); } // xsd validation against JDOM (which represents same xml as above) pukes! try { String fileContents = fileAsString(new File("testXml2.xml")); // i explictly know xml represents Integer, so OK for me to cast Integer xmlObject = (Integer)read(fileContents); Document jdom = createDocFromBean(xmlObject, true); String language = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory sf = SchemaFactory.newInstance(language); Schema schema = sf.newSchema(new File("mySchema4.xsd")); ValidatorHandler vh = schema.newValidatorHandler(); SAXOutputter so = new SAXOutputter(vh); so.output(jdom); System.out.println("TEST2: JDOM VALIDATION PASSED"); } catch (Exception e) { e.printStackTrace(); } } public static Object read( String xml ) { XStream xStream = new XStream(new JDomDriver()); StringReader reader = new StringReader( xml ); Object object = (Object) xStream.fromXML( reader ); return object; } public static Document createDocFromBean(Object bean, boolean useAttributes) { Document doc = null; try { SAXBuilder builder = new SAXBuilder(); StringWriter outputWriter = new StringWriter(); outputWriter.write(""); BeanWriter beanWriter = new BeanWriter(outputWriter); beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(useAttributes); beanWriter.getBindingConfiguration().setMapIDs(false); beanWriter.enablePrettyPrint(); beanWriter.write(bean); beanWriter.toString(); StringReader asdfas= new StringReader(outputWriter.toString()); doc = builder.build(asdfas); } catch (Exception e) { e.printStackTrace(); } return doc; } public static String fileAsString(File file) { String record; try { StringBuffer sb = new StringBuffer(1024); BufferedReader reader = new BufferedReader(new FileReader(file)); record = new String(); while ((record = reader.readLine()) != null) { sb.append(String.valueOf(record)); } reader.close(); return sb.toString(); } catch (Exception e) { System.out.println("Exception reading file: " + e); return null; } } }