Hi Brenda, If you can detect that the namespace of the elements isn't the one you expect you can change their namespace (e.g. using an XSLT transform [1]) before passing the document to the validator [2].
Thanks. [1] http://xerces.apache.org/xerces2-j/javadocs/api/javax/xml/transform/Transformer.html [2] http://xerces.apache.org/xerces2-j/javadocs/api/javax/xml/validation/Validator.html Michael Glavassevich XML Parser Development IBM Toronto Lab E-mail: mrgla...@ca.ibm.com E-mail: mrgla...@apache.org Brenda Coulson <bren...@dystech.com> wrote on 10/21/2009 09:05:10 AM: > Michael > > Thank you for your reply. I thought that was the case and given that it is > part of the Soap body, I knew it just needed to be well-formed XML. Yes that > should be the namespace for that element. However, I have no way of > enforcing the association between the elements and that namespace. Any > suggestions on how can I enforce this? At one point, I was parsing the XML, > reading all the namespaces and if my namespace was not one in the list, I > threw an exception. However, that still does not work because if you declare > it in the SOAP envelope, the parser does not complain. Any suggestions would > be greatly appreciated as this is a "bug" in my system. > > Thanks > brenda > > Michael Glavassevich-3 wrote: > > > > > > Hi Brenda, > > > > The element names in your document must match the elements declared in > > your > > schema. Their namespace is part of the name. The default namespace is > > terminology for the namespace binding for elements (and QNames in content) > > with no prefix. Also, the prefixes you declare in the schema have no > > bearing on their mapping in the instance document. You haven't declared > > the > > default namespace in your instance document, so the "getReference" element > > has no namespace. It seems like its namespace should be "? > > http://service.arm.hud.gov/". Because the content of "soapenv:Body" is > > laxly validated you won't get an error for that.. > > > > Thanks. > > > > Michael Glavassevich > > XML Parser Development > > IBM Toronto Lab > > E-mail: mrgla...@ca.ibm.com > > E-mail: mrgla...@apache.org > > > > Brenda Coulson <bren...@dystech.com> wrote on 10/20/2009 01:44:58 PM: > > > >> > >> Ok - I have made progess!! Based on a post I saw in the forums, I > > switched > >> the way I set the schemas and that has improved things tremendously. I am > > no > >> longer getting that wacky error about OpenDNS. However, the parser is > > still > >> not validating my XML file as I would expect it to. > >> > >> Here is the XML file I am trying to validate: > >> > >> <?xml version="1.0" encoding="UTF-8"?> > >> <soapenv:Envelope > > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> > >> <soapenv:Header/> > >> <soapenv:Body> > >> <getReference> > >> <agcHcsId>80000</agcHcsId> > >> </getReference> > >> </soapenv:Body> > >> </soapenv:Envelope> > >> > >> It is missing a required child element referenceId of getReference but > > the > >> parser does not complain. I know that I do not specify the namespace in > > the > >> XML file but since it is specified to the Parser, I would have thought it > >> would use it to validate. Is this a problem of it assuming that my XML is > > in > >> the default namespace and therefore not using the XSD I specify? If so, > > how > >> can I tell it to use my schema for both the target namespace and the > > default > >> namespace in the event that someone submits an XML similar to above? > >> > >> Here is my modified source code: > >> > >> String soapSchemaVersion = null; > >> if(soapVersion == 1.1) { > >> soapSchemaVersion = "gov/hud/arm/xsd/soap-envelope-1.1.xsd"; > >> } else { > >> soapSchemaVersion = "gov/hud/arm/xsd/soap-envelope-1.2.xsd"; > >> } > >> System.setProperty("javax.xml.validation.SchemaFactory:http://www. > >> w3.org/2001/XMLSchema", > >> "org.apache.xerces.jaxp.validation.XMLSchemaFactory"); > >> System.setProperty("jaxp.debug", "1"); > >> > >> SAXParserFactory parserFactory = SAXParserFactory.newInstance(); > >> parserFactory.setNamespaceAware(true); > >> parserFactory.setValidating(false); > >> parserFactory.setFeature > > ("http://apache.org/xml/features/validation/schema", > >> true); > >> parserFactory.setFeature("http://xml.org/sax/features/validation", true); > >> > >> SAXParser parser = parserFactory.newSAXParser(); > >> // set up the schema > >> Object schemas = ARM_NAMESPACE + " " + new > >> ClassPathResource(xsdResource).getURI() + " " + > >> "http://schemas.xmlsoap.org/soap/envelope/" + " " + > >> new ClassPathResource(soapSchemaVersion).getURI(); > >> parser.setProperty(">http://apache>. > >> org/xml/properties/schema/external-schemaLocation", > >> schemas); > >> XMLReader reader = parser.getXMLReader(); > >> > >> ArmHandler handler = new ArmHandler(); > >> reader.setErrorHandler(handler); > >> reader.parse(new InputSource(payload)); > >> return handler.getExceptions(); > >> > >> > >> Brenda Coulson wrote: > >> > > >> > One more thing - I am attaching the two "external" schemas - xmime and > >> > xop-include. > >> > > >> > Brenda Coulson wrote: > >> >> > >> >> Michael > >> >> > >> >> Thank you for your reply. Unfortunately there is no "OpenDNS" showing > > up > >> >> anywhere in my XML or source code files. It is quite bizarre. The fact > >> >> that I can get the XML to validate with the XMLValidator from Spring > >> >> tells me that the XML is valid and that I can use the remote locations > > of > >> >> xmime and xop-include schemas and it works. I have copied these > > version > >> >> locally so that I know they have the same content. > >> >> > >> >> I am attaching a copy of the stack trace that I receive. I could not > > find > >> >> information about the URL in the SAXParseException message- that would > > be > >> >> very useful if I could get that information. > >> >> > >> >> Regards > >> >> Brenda > >> >> > >> >> Michael Glavassevich-3 wrote: > >> >>> > >> >>> > >> >>> Hi Brenda, > >> >>> > >> >>> The error message you're getting complains about "OpenDNS" appearing > > in > >> >>> some document yet doesn't appear in any of the data you've shown. > > Such > >> >>> text > >> >>> doesn't just appear magically. There's some other document involved > > here > >> >>> that you haven't posted. It would help if you could make a connection > >> >>> between the error message you're getting and the input that you're > >> >>> feeding > >> >>> to Xerces and may also be useful to show us the stack trace rather > > than > >> >>> just mentioning that there was one. There should be information about > >> >>> the > >> >>> document's location (URL) in the SAXParseException in case you're not > >> >>> sure > >> >>> where to look for it. > >> >>> > >> >>> Thanks. > >> >>> > >> >>> Michael Glavassevich > >> >>> XML Parser Development > >> >>> IBM Toronto Lab > >> >>> E-mail: mrgla...@ca.ibm.com > >> >>> E-mail: mrgla...@apache.org > >> >>> > >> >>> Brenda Coulson <bren...@dystech.com> wrote on 10/19/2009 12:10:54 PM: > >> >>> > >> >>>> Ok - I have been struggling with this for over two weeks now and am > >> >>>> about to pull out my hair. I have scrubbed discussion groups, > >> >>>> websites for help but alas I come up with nothing. I am trying to > >> >>>> validate an XML file against the XSD schema and running into some > >> >>>> problems. The XML I would like to validate is the payload of a web > >> >>>> service SOAP message. I am using the SAXParserFactory to generate my > >> >>>> parser and I am doing the following in my code to set up the parser: > >> >>>> > >> >>>> System.setProperty("javax.xml.validation.SchemaFactory:http://www . > >> >>>> w3.org/2001/XMLSchema", > >> >>> "org.apache.xerces.jaxp.validation.XMLSchemaFactory"); > >> >>>> > >> >>>> SAXParserFactory parserFactory = SAXParserFactory.newInstance(); > >> >>>> parserFactory.setNamespaceAware(true); > >> >>>> parserFactory.setValidating(false); > >> >>>> parserFactory.setFeature > >> >>> ("http://apache.org/xml/features/validation/schema > >> >>>> ", true); parserFactory.setFeature > >> >>> ("http://xml.org/sax/features/validation > >> >>>> ", true); > >> >>>> > >> >>>> SchemaFactory schemaFactory = SchemaFactory.newInstance("http: > >> >>>> //www.w3.org/2001/XMLSchema"); > >> >>>> StreamSource soapSchemaSource = new StreamSource(new > >> >>>> ClassPathResource(soapSchemaVersion).getInputStream()); > >> >>>> soapSchemaSource.setSystemId > >> >>> ("http://schemas.xmlsoap.org/soap/envelope/"); > >> >>>> > >> >>>> StreamSource schemaSource = new StreamSource(new > >> >>>> ClassPathResource("arm-internal.xsd").getInputStream());)); > >> >>>> schemaSource.setSystemId("http://service.arm.hud.gov/"); > >> >>>> > >> >>>> parserFactory.setSchema(schemaFactory.newSchema(new Source[] > >> >>>> {schemaSource, soapSchemaSource})); > >> >>>> > >> >>>> XMLReader reader = parserFactory.newSAXParser().getXMLReader(); > >> >>>> ArmHandler handler = new ArmHandler(); > >> >>>> reader.setErrorHandler(handler); > >> >>>> reader.parse(new InputSource(payload)); > >> >>>> > >> >>>> I get no errors setting up my schema but yet when I try to parse a > >> >>>> XML file using the schema specified in newSchema, I get the > >> >>>> following exception: > >> >>>> > >> >>>> "org.xml.sax.SAXParseException: s4s-elt-character: Non-whitespace > >> >>>> characters are not allowed in schema elements other than 'xs: > >> >>>> appinfo' and 'xs:documentation'. Saw 'OpenDNS'" > >> >>>> > >> >>>> It is followed by a stack trace. > >> >>>> My schema actually imports 2 external schemas and when I specify > >> >>>> their schema location as a URL, not a local file, it works but i can > >> >>>> not rely on that because I do not have access to the internet. > >> >>>> > >> >>>> I can attach my XML and XSD files but there is no place to do so. I > >> >>>> will add them at the end. > >> >>>> > >> >>>> Here are my questions/issues: > >> >>>> > >> >>>> 1. How do I solve the problem above from happening other than > >> >>>> relying on the internet to find the schema. > >> >>>> 2. When I do modify my XML file, the above exception is corrected > >> >>>> but then I get an error saying it can not resolve the soapenv > >> >>>> namespace. > >> >>>> 3. Ultimately what I am interested in is getting the parser to > >> >>>> validate my XML correctly. It is intentionally flawed - there is a > >> >>>> bug in our system I am trying to correct. We were previously using > >> >>>> XMLValidator (from Spring) but it has no ability to > >> >>>> configure/customize so I switched to use the SAXParser. Ultimately, > >> >>>> I need the validator to complain when an element is missing. In my > >> >>>> XML below, I am missing the required element of referenceId but the > >> >>>> parser does not complain about it. Incidentally, it does not matter > >> >>>> if I supply the namespace or not in my XML file since I am > >> >>>> specifying the XSD in the application code in terms of it validating > >> >>>> the XML correctly. > >> >>>> > >> >>>> Thank you so much > >> >>>> Brenda > >> >>> > >> >> http://www.nabble.com/file/p25978879/SAXParseException.txt > >> >> SAXParseException.txt > >> >> > >> > http://www.nabble.com/file/p25978928/xmime.xsd xmime.xsd > >> > http://www.nabble.com/file/p25978928/xop-include.xsd xop-include.xsd > >> > > >> > >> -- > >> View this message in context: http://www.nabble.com/SAXParser-> > >> Problem-tp25961802p25979459.html > >> Sent from the Xerces - J - Users mailing list archive at Nabble.com. > >> > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: j-users-unsubscr...@xerces.apache.org > >> For additional commands, e-mail: j-users-h...@xerces.apache.org > > > > -- > View this message in context: http://www.nabble.com/SAXParser- > Problem-tp25961802p25992119.html > Sent from the Xerces - J - Users mailing list archive at Nabble.com. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: j-users-unsubscr...@xerces.apache.org > For additional commands, e-mail: j-users-h...@xerces.apache.org