Hi, Michael. That was my original plan, but I needed to keep compatibility with Xerces 2.8, thus the extra step.
Actually, I also had to add one more layer to get it to work in a broader set of use cases. I had to extend XMLEntityResolver to provide a means for reliably resolving schema imports without schemaLocation(s). I tweaked my schema snippet collection to be keyed by targetNamespace, and inside the resolver, if I see a null location, I use my resolver, otherwise I delegate the work to the original resolver. Currently, it would not work properly if multiple snippets had the same targetNamespace, but I plan on adding some code to merge grammars from the same namespace. When it is all done, the net result should be the shell of a generic WSDL->to->XSModel parser. - Rick *** Sent via BlackBerry -----Original Message----- From: Michael Glavassevich <[EMAIL PROTECTED]> To: j-users@xerces.apache.org <j-users@xerces.apache.org> CC: j-dev@xerces.apache.org <j-dev@xerces.apache.org> Sent: Sun Dec 03 12:02:19 2006 Subject: Re: (POSSIBLE SOLUTION) Serious issue/challenge with Xerces-J the XSLoader's loadInputList method... Hi Rick, If the schema element returned from WSDL4J is a DOM node, you should be able to pass that directly to the XMLGrammarPreparser using a DOMInputSource [1] and skip the serialziation step. Thanks. [1] http://xerces.apache.org/xerces2-j/javadocs/xerces2/org/apache/xerces/util/DOMInputSource.html On Mon, 27 Nov 2006, Bullotta, Rick wrote: > Hello, all good news! > > Via a combination of WSDL4J and Xerces, I think I have something that > works that I'd like to share (for your benefit, critique, and > improvements). > > The code is based on WSDL4J 1.6 and Xerces 2.9, but should work with > older versions is well. > > 1) First, load the WSDL using a WSDL4J WSDLReader, being certain that > the javax.wsdl.importDocuments feature is set to true. > > 2) Next, create an ArrayList or other structure to hold schema > "snippets" > > 3a) Next, do a recursive walk of the WSDL (diving into imports) looking > into the getTypes() collection for either: > - Schema extensibility elements > - Unknown extensibility elements where getElementType() > corresponds to a schema QName > > 3b) Clone the schema element, and add any namespaces (via attributes) to > it that exist in the top level Definition (and do not conflict with > namespaces already assigned to the schema element) > > 3c) Serialize the schema element to a string, and create a StringReader > for it > > 3d) Add it to the "schema snippet holder" > > 4) Use the XMLGrammarPreparser and an XSGrammarPool to iteratively > process the schema grammar(s), then create an XSModelImpl passing the > array of SchemaGrammar(s). > > public static XSModel parseMultiple(SchemaCollection coll) { > try > { > XMLGrammarPreparser grammarPreparser = new > XMLGrammarPreparser(); > XSGrammarPool grammarPool = new XSGrammarPool(); > grammarPreparser.setGrammarPool(grammarPool); > grammarPreparser.setErrorHandler(new > XMLErrorReporter().getErrorHandler()); > > try > { > int nItems = coll.getLength(); > > SchemaGrammar[] grammars = new SchemaGrammar[nItems]; > > for(int i=0;i<nItems;i++) { > XMLInputSource is = null; > is = new > XMLInputSource(null,null,null,coll.rawItem(i),null); > > > grammarPreparser.registerPreparser(XMLGrammarDescription.XML_SCHEMA,null > ); > XMLGrammarLoader schemaLoader = > grammarPreparser.getLoader(XMLGrammarDescription.XML_SCHEMA); > grammars[i] = > (SchemaGrammar)grammarPreparser.preparseGrammar(XMLGrammarDescription.XM > L_SCHEMA,is); > } > > return new XSModelImpl(grammars); > } > catch (Exception e) > { > //parser will return null pointer exception if the document > is > } > } > catch (Exception e) > { > } > > return null; > > } > > 5) Use the combined XSModel as needed... > > This approach seems to work well, but I'm certainly open for > suggestions/improvements. > > Rick Bullotta > SAP Labs, LLC > > http://www.sap.com/manufacturing > > -----Original Message----- > From: Bullotta, Rick [mailto:[EMAIL PROTECTED] > Sent: Saturday, November 25, 2006 11:50 PM > To: j-dev@xerces.apache.org; j-users@xerces.apache.org > Subject: Serious issue/challenge with Xerces-J the XSLoader's > loadInputList method... > > Hello, all. > > Here's a quick summary - the WSDL below contains two schema elements. I > want to create an XSModel that represents this WSDL, and the only way I > can see to do so is by extracting the schema elements separately, > turning them into LSInputs, and using the loadInputList method on the > XSLoader class. Unfortunately, it does not work - there is always an > error attempting to resolve the n0:YYY type when it attempts to create > the XSModel. > > If I separate the first schema element into its own file, and import it, > it works fine. However, it should work fine in the same file as well! > :-( > > I suspect it has something to do with the fact that imports within the > same "file" (in the case of loadInputList, of course, they are separate > sources), would not have a schemaLocation attribute on the import, but > only a namespace attribute (as below). I am at a loss to determine how > to handle this with Xerces. > > In this case, I would expect Xerces to simply see if a model or grammar > has already been loaded for that namespace. I tried as hard as I could > to trace through the source, but I was completely lost working through > the intricacies of how these things are resolved. > > Help!!! > > - Rick Bullotta > SAP Labs, LLC > > > <?xml version="1.0" encoding="utf-8"?> > <wsdl:definitions > targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style" > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" > xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" > xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" > xmlns:tns="urn:sap-com:document:sap:soap:functions:mc-style" > xmlns:n1="urn:sap-com:document:sap:rfc:functions"> > <wsdl:types> > <xsd:schema attributeFormDefault="qualified" > targetNamespace="urn:sap-com:document:sap:rfc:functions" > xmlns:tns="urn:sap-com:document:sap:rfc:functions" > xmlns:xsd="http://www.w3.org/2001/XMLSchema"> > <xsd:complexType name="YYY"> > <xsd:sequence> > <xsd:element name="Param1" > type="xsd:string"/> > <xsd:element name="Param2" > type="xsd:string"/> > <xsd:element name="Param3" > type="xsd:string"/> > </xsd:sequence> > </xsd:complexType> > </xsd:schema> > <xsd:schema attributeFormDefault="qualified" > targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style" > xmlns:tns="urn:sap-com:document:sap:soap:functions:mc-style" > xmlns:n0="urn:sap-com:document:sap:rfc:functions" > xmlns:xsd="http://www.w3.org/2001/XMLSchema"> > <xsd:import > namespace="urn:sap-com:document:sap:rfc:functions"/> > <xsd:element name="ZmsWsXmiiTest1"> > <xsd:complexType> > <xsd:sequence> > <xsd:element > name="Param" type="n0:YYY"/> > </xsd:sequence> > </xsd:complexType> > </xsd:element> > <xsd:element name="ZmsWsXmiiTest1Response"> > <xsd:complexType> > <xsd:sequence/> > </xsd:complexType> > </xsd:element> > </xsd:schema> > </wsdl:types> > <wsdl:message name="ZmsWsXmiiTest1"> > <wsdl:part name="parameters" > element="tns:ZmsWsXmiiTest1"/> > </wsdl:message> > <wsdl:message name="ZmsWsXmiiTest1Response"> > <wsdl:part name="parameters" > element="tns:ZmsWsXmiiTest1Response"/> > </wsdl:message> > <wsdl:portType name="zms_ws_xmii_test1"> > <wsdl:operation name="ZmsWsXmiiTest1"> > <wsdl:input message="tns:ZmsWsXmiiTest1"/> > <wsdl:output > message="tns:ZmsWsXmiiTest1Response"/> > </wsdl:operation> > </wsdl:portType> > </wsdl:definitions> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------- Michael Glavassevich XML Parser Development IBM Toronto Lab E-mail: [EMAIL PROTECTED] E-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]