| |
comp.lang.java.programmer |
Corrections needed (my guess): <!ELEMENT update> and: <!ELEMENT shortcut (desktop? menu?)> DTD for 1.5 seems to be correct. If you want convert them automatically to XSD (as Andrew suggested (about a year ago I successfully used XMLSpy for that) However, instead of validating against XSD, there is also possibility to piotr import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; public class ValidateJNLP { public static void main(String[] args) throws Exception { // rewrite input file... StringWriter rewrite_out = new StringWriter(); XMLInputFactory xif = XMLInputFactory.newInstance(); XMLEventReader er = xif.createXMLEventReader( while (er.hasNext()) { if (e.isStartElement()) { // System.out.println(rewrite_out.toString()); // validate... SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); InputSource is = new InputSource(rewritten_in); @Override @Override @Override
> I got an email from Sun. They said they post a DTD for 1.5 and 6, but
> no xsd or other advanced schemas. I have the URLS at
> http://mindprod.com/jgloss/jnlp.html
and in Appendix C of JNLP specification).
should be:
<!ELEMENT update EMPTY>
should be:
<!ELEMENT shortcut (desktop?, menu?)>
earlier) some tools you can find there:
http://www.w3.org/XML/Schema#Tools
validate JNLP file against DTD directly. That usually requires an
addition (or rewriting) of DTD in that file. But hopefully, we can
perform that on the fly -- an example using StAX (from Java 6) is below.
import javax.xml.stream.*;
import javax.xml.stream.events.*;
import org.xml.sax.helpers.*;
File input_file = new File(args[0]);
File dtd_file = new File("JNLP-6.0.dtd");
XMLOutputFactory xof = XMLOutputFactory.newInstance();
XMLEventFactory xef = XMLEventFactory.newInstance();
new FileReader(input_file));
XMLEventWriter ew = xof.createXMLEventWriter(rewrite_out);
XMLEvent e = er.nextEvent();
// creatre new DTD
DTD dtd = xef.createDTD("<!DOCTYPE jnlp"
+ " SYSTEM \"" + dtd_file.toURI() + "\">");
ew.add(dtd);
ew.add(e);
break;
} else if (e instanceof DTD) {
// skip original DTD
System.err.println("original DTD skipped!");
} else {
// write event as is
ew.add(e);
}
}
// write all left input events...
ew.add(er);
ew.flush();
ew.close();
StringReader rewritten_in
= new StringReader(rewrite_out.toString());
spf.setValidating(true);
sp.parse(is, new JNLPErrorHandler());
}
public void warning(SAXParseException exception) throws SAXException {
System.err.println(exception);
}
public void error(SAXParseException exception) throws SAXException {
System.err.println(exception);
}
public void fatalError(SAXParseException exception) throws
SAXException {
System.err.println(exception);
}