Hello! I am trying to develop an app that will use XML schema with some additional annotations. Annotations come in various forms, including the attributes added to XML element definitions. I am using a different namespace for these attributes. I know this is not exactly canonical for Schema but still XML-legal :) Plus, I have found (thanks to this list) the feature " http://apache.org/xml/features/generate-synthetic-annotations" that puts all my custom stuff into the annotations that I can access via XSElementDeclaration.getAnnotation().
Initially I have found a bit hacky way to load my schemas by following this path: XSImplementation impl = new XSImplementationImpl(); XSLoader loader = impl.createXSLoader(impl.createStringList(new String[]{"1.0"})); ... loader.getConfig().setParameter(" http://apache.org/xml/properties/internal/entity-resolver", resolver); loader.getConfig().setParameter(" http://apache.org/xml/properties/internal/error-handler", errorHandler); loader.getConfig().setParameter(" http://apache.org/xml/features/generate-synthetic-annotations", true); XSModel model = loader.loadURI("file://" + schemaFileName); This works, I can use the API to find my element and its annotation. Then I have realized that there are two ways to handle the annotation data - write it to DocumentFragment or to SAX handler. There is more value for me in DOM since I need to deal with some additional document elements anyway, so, again following the suggestions from this list I have tried another approach: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(false); DocumentBuilder db = dbf.newDocumentBuilder(); ...setting entity resolver and error handler... Document doc = null; try ( BufferedReader br = new BufferedReader(new FileReader(modelFile)) ) { doc = db.parse(new InputSource(br)); } catch (IOException e) { ... } XMLGrammarPreparser preParser = new XMLGrammarPreparser(); preParser.setEntityResolver(resolver); preParser.setErrorHandler(errorHandler); preParser.setFeature(" http://apache.org/xml/features/generate-synthetic-annotations", true); preParser.setFeature(" http://apache.org/xml/features/validation/schema-full-checking", true); preParser.setFeature("http://apache.org/xml/features/validation/schema", true); preParser.setFeature(" http://apache.org/xml/features/honour-all-schemaLocations", true); preParser.setFeature(" http://apache.org/xml/features/validate-annotations", false); preParser.setFeature(" http://apache.org/xml/features/generate-synthetic-annotations", true); preParser.registerPreparser(XMLGrammarDescription.XML_SCHEMA, null); DOMInputSource modelSource = new DOMInputSource(doc); XSGrammar grammar = (XSGrammar)preParser.preparseGrammar(XMLGrammarDescription.XML_SCHEMA, modelSource); XSModel model = grammar.toXSModel(); I do get the model here and I can use the same methods to find my element. However, with this approach I get no annotations! Element's getAnnotation() returns null. By the way, I do have also a real annotation for this element (documentation). Using Xerces 2.11.0.SP1. If needed, I can reduce my test schema and code to minimum and post here - but maybe someone already knows the answer? Thanks! -- Nikolai Grigoriev