XML validation with StAX
Hi,
I have a requirement to validate XMLs during JAXB unmarshalling and during StAX parsing. The schema is packaged in a jar. I am able to successfully read the schema, and validate the XML during unmarshalling by setting the schema in the unmarshaller (through setSchema()).
However, I am not able to validate it with StAX using the same schema and same XML.
Here is the code snippet for StAX:
StringReader stringReader = new StringReader(inputXMLStr);
XMLEventReader xmlEventReader = XMLInputFactory.newInstance().createXMLEventReader(stringReader);
EventFilter filter = new EventFilter() {
public boolean accept(XMLEvent event) {
return event.isStartElement();
XMLEventReader xmlFilteredEventReader = xmlif.createFilteredReader(xmlEventReader, filter);
Schema mySchema = getSchema(); // this method retrieves the schema by reading the schema files as
stream source and calling schemaFactory.newSchema(...)
Validator validator = mySchema.newValidator();
validator.setErrorHandler(new SchemaErrorHandler());
Source xmlSource = new StAXSource(xmlFilteredEventReader);
validator.validate(xmlSource);
I get a SAX Parse exception saying "cvc-elt.1: Cannot find the declaration of element 'myElement'"
And I also see the following exception:
Caused by: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(StAXEvent2SAX.java:171)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(StAXEvent2SAX.java:118)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:651)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelper.validate(StAXValidatorHelper.java:89)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:114)
at javax.xml.validation.Validator.validate(Validator.java:127)
I am not able to figure out why the validation would work with UnMarshaller but not with StAX.
Any help appreciated.
Thanks
Meera
Have u tried the Stream STAX parser instead?
something like:
SchemaFactory factory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
File schemaLocation = new File(XSD_FILE_PATH);
Schema schema = factory.newSchema(schemaLocation);
// 3. Get a validator from the schema.
Validator validator = schema.newValidator();
ErrorHandler lenient = new ForgivingErrorHandler(fw);
validator.setErrorHandler(lenient);
XMLInputFactory staxFactory = XMLInputFactory.newInstance();
staxFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,
Boolean.TRUE);
staxFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,
Boolean.FALSE);
staxFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE,
Boolean.TRUE);
staxFactory .setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
FileInputStream fis = new FileInputStream(XML_FILE_PATH);
XMLStreamReader xmlr = staxFactory.createXMLStreamReader(fis);
validator.validate(new StAXSource(xmlr));
Similar Messages
-
XML Validation with multiple XSD files (referenced)
Hello,
I know that XML validation with version 7.1 is possible now. However I was provided with a set of XSD files that have references to each other and need to be placed in a hierachical file system order so that references can be resolved.
An element <xsl:include schemaLocation="../../baseSchemas/baseSchema.xsd" /> is used for example. How can I handle that for XSD validation in PI? Can I create the same folder structure or do I need to put all XSD files in one directory and change the import manually?
But most important question: Is it possible it all to use more than one XSD for schema validation?Dear Florian,
I had encountered such case in a project.
I was given 3 files. One main file and 2 others called Schema1.xsd and Schema2.xsd.
This happens because your data type is not in single namespace, but is being referred across namespaces and software components.
I am assuming that you have read the How to Guide for XML validations on PI 7.1
Best way to do this quickly is as follows.
1. Enable XML validation at adapter engine in the sender agreement.
2. Post a message using HTTP post. (http://sappihttpclient.codeplex.com)
3. Check communication channel in runtime workbench. There will be an error saying which is missing at what path.
4. Create the path mentioned and place the file at that path.
5. Repeat steps 2,3,4 for all the files.
When you are done with this, you will get a proper validation error in case XML file is not correct. And remember to generate XSD from message type and not data type.
Regards,
Vikas
Edited by: Vikas Aggarwal on Sep 2, 2009 8:45 PM
Edited by: Vikas Aggarwal on Sep 2, 2009 8:48 PM -
XML validation with DTD in java 1.5 not supporting
Hi,
I am facing a problem regarding validation of xml file with DTD tag in it.
I have disabled the parser through setValidating(false) method.
xml file is not parsed in JRE 1.5.but it is parsed in JRE 1.6.
Why this is showing such a behavior?
I have used xerces 2.9.0,xml-api.jar and other jar regarding XML api but still it is giving error.
please help me.
please provide a jar file name or its issue resolution in jre 1.5 or 1.4.thanks for your prompt reply.
I required that it should be completely disabled in jre 1.5(jdk1.5 or 1.4).
I am using DOM Parsing.I have currently disabled with follwowing method,
builderFactory.setValidating(false);
builderFactory.setFeature("http://xml.org/sax/features/validation",
false);
builderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
builderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);
builderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
builderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
in 1.6 it is working fine but I required that i have to disabled it.but it is giving a error in jre1.5.
Exception in thread "main" java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
I just want to disable the parsing in jdk version 1.5 or 1.4
thanks in advance
anand -
XML validation with JDOM / JAXP
Hello,
I am trying to validate xml file against schema file. I decided to use JDOM and JAXP.
First question: is it a good choice?
I did a first attempt but not sure I have understood all what I am doing :(
First I have create a parser usinf org.jdom.*
SAXBuilder parser = new SAXBuilderThen I built my document:
Document doc = parser.build(myFile)These 2 steps are ok. But it does not do validation.
I saw in the JDOM documentation that I can set a validation flag to true. I did it. First problem, I got the following error from JDOMException: Document is invalid: no grammar found.
Is there a way to specify to the parser where to find the xsd file?
As I did not find answer to this question by myself, I tried implementing the Schema class from JAXP:
SAXBuilder parser = new SAXBuilder;
Document doc = parser.build(myFile);
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(schemaFile);
ValidatorHandler vh = schema.newValidatorHandler();
SAXOutputter so = new SAXOutputter(vh);
so.output(doc);It does the validation against the schema file specified but I am not really sure about what I am doing here. The last 2 commands are not clear to me :(
Then in my schema file, I have elements that have default value. I expected the following behavior: if the element is not in the xml file then the default will be used by the parser (and added in the tree). But it seems, it's not the case.
Any help/explanation will be really appreciated.I am trying to validate xml file against schema file. I decided to use JDOM and JAXP.
First question: is it a good choice?
If only schema validation is required use the validation API in JDK 5.0.
http://www-128.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html
http://java.sun.com/developer/technicalArticles/xml/validationxpath/
For validation with JDOM, the following validation application explains the procedure:import org.jdom.input.SAXBuilder;
import org.xml.sax.SAXException;import org.jdom.*;
import java.io.*;
public class JDOMValidator{
public void validateSchema(String SchemaUrl, String XmlDocumentUrl){
try{
SAXBuilder saxBuilder = new SAXBuilder("org.apache.xerces.parsers.SAXParser",true);<br/>saxBuilder.setValidation(true);
saxBuilder.setFeature("http://apache.org/xml/features/validation/schema",true);
saxBuilder.setFeature("http://apache.org/xml/features/validation/schema-full-checking",true);
saxBuilder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",SchemaUrl);
Validator handler=new Validator();
saxBuilder.setErrorHandler(handler);
saxBuilder.build(XmlDocumentUrl);
if(handler.validationError==true)
System.out.println("XML Document has Error:"+handler.validationError+""+
handler.saxParseException.getMessage());
else
System.out.println("XML Document is valid");
}catch(JDOMException jde){
}catch(IOException ioe){
private class Validator extends DefaultHandler{
public boolean validationError = false;
public SAXParseException saxParseException=null;
public void error(SAXParseException exception) throws SAXException{
validationError =true;
saxParseException=exception;
public void fatalError(SAXParseException exception) throws SAXException {
validationError = true;
saxParseException=exception;
public void warning(SAXParseException exception) throws SAXException {
public static void main(String[] argv) {
String SchemaUrl=argv[0];StringXmlDocumentUrl=argv[1];
JDOMValidator validator=new JDOMValidator();
validator.validateSchema(SchemaUrl,XmlDocumentUrl);
} -
XML Validation with External XSD
Hi
I have a xml file having DTD declaration, but my requirment is to validate this xml file with External XSD not with DTD which is declared inside the file.
on executing java code below it is looking for DTD. how to supress validating against dtd.
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
SchemaFactory schemaFactory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setSchema(schemaFactory.newSchema(
new Source[] {new StreamSource("C:\\vittal\\Project\\received\\development-1\\da_xsd\\daAuthoring.xsd")}));
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new LogErrorHandler());
reader.parse(new InputSource("C:\\vittal\\Project\\received\\A-ADD\\DAContentExamples_2\\SampleGuidance_1.xml"));error i am getting is License file saxon-license.lic not found. Running in non-schema-aware mode
java.io.FileNotFoundException: C:\vittal\Project\received\A-ADD\DAContentExamples_2\daAuthoring.dtd (The system cannot find the file specified)Hi
I have a xml file having DTD declaration, but my requirment is to validate this xml file with External XSD not with DTD which is declared inside the file.
on executing java code below it is looking for DTD. how to supress validating against dtd.
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
SchemaFactory schemaFactory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setSchema(schemaFactory.newSchema(
new Source[] {new StreamSource("C:\\vittal\\Project\\received\\development-1\\da_xsd\\daAuthoring.xsd")}));
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new LogErrorHandler());
reader.parse(new InputSource("C:\\vittal\\Project\\received\\A-ADD\\DAContentExamples_2\\SampleGuidance_1.xml"));error i am getting is License file saxon-license.lic not found. Running in non-schema-aware mode
java.io.FileNotFoundException: C:\vittal\Project\received\A-ADD\DAContentExamples_2\daAuthoring.dtd (The system cannot find the file specified) -
I have created a XML file with dom4j and the file confirmed to be valid when I read the file with Internet Explorer, a online XML validator and a free XML editor called "CookTop". However, when I attemp to read the XML file during the execution of an ant task I always get the XML parsing exception that one of my tag is not closed. I have even wrapped that test inside the tag as CDATA but that does not help as well. Do any one know what's happening? Here's my environment:
JDK: 1.4.2_05
Xerces: 2.6.2
Ant: 1.5.3
Thanks so much in advance.
I've been pumping my head into the wall for hours : pCan i know where to download the CookTop?or CookTop2?
-
XML Validation with no connection to the internet
Hi,
I'm trying to validate a ml instance document against a xml schema, using the javax.xml.validation.Validator.validate() method. This works fine as long as I have an internet connection, but not when I disconnect from the internet it fails.
I've detected, using a network sniffer, that this is due to the fact that the validation process tries to fetch the XMLSchema.dtd and datatypes.dtd from w3.org. Is there any way to avoid this by prestoring these somewhere? So that the internet connection is not needed?
I need to be able to do validation without a connection to the internet since the environment where my application is deployed does not have such a connection.
RayHi Ray,
Were you able to resolve this issue? I am encountering a very similar problem where I am not connected to the internet and it fails during the newSchema method on javax.xml.validation.SchemaFactory. I have attempted to implement the suggestions of ExtremeGardener and vidyut with no luck.
Per ExtremeGardener's suggestion of replacing xmlns:xs="http://www.w3.org/2001/XMLSchema" with xmlns:xs="XMLSchema.xsd" and storing it locally, it gave me an error for trying to set the "xs" or "xsd" prefixes to anything other than "http://www.w3.org/2001/XMLSchema." I forget the exact error. I also tried to use my own prefix and it did not like that either.
Per vidyut's suggestion of using a catalog resolver, I believe that I have tried that too (if I understand correctly). I created an LSResourceResolver and tied it to the SchemaFactory. I can invoke it for a namespace but that did not resolve the issue because it only invokes the resolver on an import, include, or redefine. I believe that it is trying to reach the internet due to the xmlns:xs="http://www.w3.org/2001/XMLSchema" attribute within the top-level schema element in the XSD and I know of no way to invoke it for that.
I also created an ErrorHandler and tied it to the SchemaFactory. That shows me the errors and they are all related to the standard XML data types defined in XMLSchema.xsd. The errors that I am seeing are all of this form: "UndeclaredPrefix: Cannot resolve 'xs:string' as a QName: the prefix 'xs' is not declared."
I am currently using the SchemaFactory in Java 1.5, but I am thinking about trying the Xerces SchemaFactory since they are not exactly the same implementation.
Does anyone have any other suggestions? Any help you can provide would be greatly appreciated!
Thanks,
betzro1 -
XML Validation with DTD... Urgent
Hi all,
I am using java 1.4
I have to validate the XML file with the external DTD.
Can anyone give me the code for that.
DTD should be external.
Thanks,
Vinayak.If you are using Solaris , it has xml validation tool "xmllint", using this you can validate your xml against DTD.
try with "xmllint --help " to see all the option.
Message was edited by:
sasrivas -
Hi Team,
I want to validate the XML content with DTD refered in the XML. I have problem now is my DTD are present in a jar file. How do I need to set systemid to the input source so that it works.
<!DOCTYPE test SYSTEM "test.dtd">
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
inputSource.setSystemId("path");
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new XmlValidationErrorHandler());
reader.parse(inputSource);
Regards
Richardi believe the best way to handle that would be to set the EntityResolver on the XMLReader to your own implementation which loads the DTD from the jar.
-
Please clarify the following
1) To validate a XML output with a XSD is it necessary to register the xsd in the database?.
2) I tried running the below give command to register the .xsd file. It errored out with the below message. Do we need to some additional installation for having dbms_xmlschema in oracle database or am I missing something. My ver of oracle is 9.2.0.6.0.
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00201: identifier 'DBMS_XMLSCHEMA.REGISTERSCHEMA' must be declared
BEGIN
DBMS_XMLSchema.registerSchema(
schemaurl=>'http://ifsddev.na.abc.com/home/vick/105564/batchuserimport.xsd',
schemadoc=>sys.UriFactory.getUri('/home/vick/105564/batchuserimport.xsd'));
END;1) You could validate XML files against an XSD by using standard Java, PL/SQL, etc. functionality. Just to validate XML you do not need to register the schema in XDB. See e.g. http://www.oracle.com/technology/pub/articles/vohra_xmlschema.html
2) Also see: DBMS_XMLSCHEMA.REGISTERSCHEMA' must be declared to know whether XML DB has been installed/configured.
Regards, Ronald -
XML Validation with XSD in java mapping
Hi experts,
I have created an interface to send differents messages between bussines system, the bussiness system receiver is put in the message, to get this value I have a configuration file indicating the path of this field for each message type. In a java mapping I transform the message sent in this structure:
<document>
<message>HERE THE MESSAGE AS STRING</message>
<parameters>
<sender>HERE SENDER BUSSINESS SYSTEM</sender>
<receiver>HERE RECEIVER BUSSINESS SYSTEM</receiver>
</parameters>
</document>
the messaging interface works fine, but now I have to validate the XML vs XSD. I need doing in a java mapping because the messaging interface send the message and a email to sender in error case.
To do this validation I have implemented two java mappings that works fine in my local, the first way is with class Validator of java 5, but my system PI 7.1 return an error with this class. The second way is with SAX parse:
String schema = "XXXXXxsd";
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
docBuilderFactory.setValidating(true);
docBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2001/XMLSchema");
InputStream is = this.getClass().getClassLoader().getResourceAsStream(schema);
docBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",is);
in my local works fine but in PI always return OK never fail.
For this moment the schema is hardcoded to do proofs, in the future will be loaded from my configuration file.
Any idea?
Thanks in advance
Josehi Jose,
PI 7.1 has a built in feature available called XML vaidations ..
your source xml can be validated against a XSD placed at a specific location on the PI server..
validation can be performed at adapter/integration engine
http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/d06dff94-9913-2b10-6f82-9717d9f83df1?quicklink=index&overridelayout=true -
XML validation with DTD stored in String object
Does anyone know if this is plausible......
I am trying to validate some XML with a DTD... easy enough, right? The catch is that the dtd is NOT stored in a file somewhere and is also not declared in the XML to be validated. It is stored in a String object (as is the XML file to be validated).
To clarify - I want to do something like this... but not sure how to incorporate the DTD.
String dtd = // dtd definition here
String xml = // xml text here (no URI at the top)
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler(); // DTD handler??
parser.parse(new InputSource(new StringReader(xml.toString())), handler);any help would be greatly appreciated.
thanks in advance,
TerranceI guess it makes the most sense to make the dtd local to the xml. Therefore I would only have one string with both the xml contents and dtd contents. That is how I am going to approach this unless I hear something different.
-
XML Validation with Sun Multischema XML Validator
Dear readers,
I am able to parse an XML file and validate it with a W3C-schema.
But has anyone ever tried and succeeded in validating a part of an XML file or DOMDocument? It should go with the Sun MultiSchema Validator.
Available @ http://wwws.sun.com/software/xml/developers/multischema/
If anyone has a nice working example for validating a part of an XML-file it would certainly come in handy!
I think it has something to do with that Acceptor interface...
Any help is welcome.
Regards
BramSolved the problem myself...
Dukedollars are removed.
You can use Sun multischema validator in combination with dom4j and
manipulate your XML doc in memory. And also validate on Node level! -
XML validation with an external Schema
Hi all,
i'm testing some EJBs under oc4j and I have problems validating some XML documents against an external Schema file.
The code only uses JAXP classes and interfaces and it's already running with other application servers.
The code is:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
The setAttribute method of the DocumentBuilderFactory throws an IllegalArgumentException meaning that this feature is not supported.
Is that true?
Someone knows another way to perform this validation without hardcoding Oracle libraries' specific code?
Thanks
FHi all,
i'm testing some EJBs under oc4j and I have problems validating some XML documents against an external Schema file.
The code only uses JAXP classes and interfaces and it's already running with other application servers.
The code is:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
The setAttribute method of the DocumentBuilderFactory throws an IllegalArgumentException meaning that this feature is not supported.
Is that true?
Someone knows another way to perform this validation without hardcoding Oracle libraries' specific code?
Thanks
F -
How to make xml validation with automatic error fixed
Hi', i have some string which i want to validate it:
String word = "<style>body {background-color:transparent}";
byte[] bytes = word.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setValidating(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
DOcument doc = docBuilder.parse(inputStream);This code will produce some exception like this:
Warning: validation was turned on but an org.xml.sax.ErrorHandler was not set, which is probably not what is desired. Parser will use a default ErrorHandler to print the first 10 errors. Please call the setErrorHandler method to fix this.
Error: URI = "null", Line = "1", : Document root element "style", must match DOCTYPE root "null".
Error: URI = "null", Line = "1", : Document is invalid: no grammar found.
org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.Is there anyway to make this validation not only show the errors but automatic fix it?
Thanks a lot...I mean there is no general method which is capable of correcting all possible errors found by schema validation.
For example if the validation says it expected to find an <organization> element or a <company> element but it found a <banana> element, there is no way to determine what repair is necessary.
Anyway the requirement is fighting against the way things work in the real world. The purpose of validation is just to find out whether a document matches a schema. If it doesn't, then too bad. Send it back to be fixed or replaced. If you are having a problem because you repeatedly get documents which don't quite match your schema, then you need to train the users to produce valid documents or to give them tools which help them do that.
Maybe you are looking for
-
HT204053 I have an apple id but how do I get one for icloud?
I am trying to use photo stream and have an apple id but it just tells me it doesn't work for icloud, but doens't say how to get one.
-
I want to sync my music library of my Ipad to my Iphone.I am travelling overseas and do not have access to my synced Mac. My iphone had to be reset and I lost my library with I rest to use a new sim card. I have a PC with me which has Itunes but it d
-
MBP in clamshell with iMac G5?
Hi all, Just acquired a MBP (late 2011) 15" and was wondering whether I could use it in "clamshell" mode, with my iMac G5 with iSight as an external monitor? If it's possible, what's involved and what cable(s) will be needed? Thanks in advance for yo
-
dear sir/ me dam i am creating new vendor code but saving problem for number range is sowing account already exists
-
T420s wireless driver problem - after restore/reinstall
i have a 420s that works fine. but something went strange with the wireless after one of the updates, not sure if it was windows or lenovo update. in any event, i tried reinstalling the driver, and it stayed broke. so i rolled back the computer to a