Domanda

Okay, quindi ecco il corto di quello che sto cercando di ottenere. Sto sviluppando una piccola applicazione Google App Engine che genera XML data un particolare oggetto.

Ora, ho incontrato problemi perché ho bisogno di usare uno schema relax NG e convalidarlo contro il mio oggetto documento. Funziona bene sulla mia macchina locale (Eclipse Helios Java Ee, Mac OS X Snow Leopard, Google Web Toolkit 2.2.0, Motore di Google 1.4.2), ma non appena ho implementato il motore dell'app, il mio codice fallisce e lancia un illegalmente un illegalmente .

L'eccezione specifica è questa:

   java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://relaxng.org/ns/structure/1.0 could be loaded
.

Le linee specifiche del codice che si lamentano sono le seguenti:

  System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
  SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
.

L'ultima riga è la linea che lancia l'eccezione.

Ho provato a cercare online e pubblicato in diversi gruppi di Google, ma nessuno è venuto avanti con un'idea.

Nota: Ho preso l'uso di parte del codice sopra da questo esempio: Come convalidare un documento XML utilizzando uno schema relax NG e JAXP?

Il mio sospetto è che l'app Motore non sta caricando Jing.jar per qualche motivo. Non so come posso controllare che sia / non è.

Qualsiasi aiuto sarebbe apprezzato! Grazie!

È stato utile?

Soluzione 3

Bene, ho effettivamente trovato un workaround di sorta che tira fuori completamente l'uso (praticamente hackash) del sistema.setproperty.

Si scopre che Jing ha una piccola classe chiamata "CompactSyntaxSchemafactory".

Ecco come l'ho usato:

    DocumentBuilderFactory docFactory = null;

    CompactSyntaxSchemaFactory scReader = new CompactSyntaxSchemaFactory();
    URL relaxSchemaURL = new URL("http://example.com/myschema.rng");
    Schema2 relaxSchema = scReader.newSchema(relaxSchemaURL);

    docFactory = DocumentBuilderFactory.newInstance();
    docFactory.setSchema(relaxSchema);
.

ha funzionato come un fascino.

Altri suggerimenti

Questo post solo per chiarire.

Il modo usuale convalidare un documento XML con Jing e Relax NG è:

System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
Schema schema = factory.newSchema(new File("path/to/schema.rng"));

Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));
.

Ora, nel motore dell'app, le prime due linee non funzionano e causano il lancio di un illegalArgumentException, come hai detto.Quindi scambiandoli con

SchemaFactory factory = new XMLSyntaxSchemaFactory();
.

fa il trucco.Riepilogo (incluse le importazioni):

import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory;

SchemaFactory factory = new XMLSyntaxSchemaFactory();
Schema schema = factory.newSchema(new File("path/to/schema.rng"));

Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));
.

Si noti che questo è per schemi in sintassi XML.Per la sintassi compatta, Exchange XMLSyNtaxSchemaAfactory con CompactSyntaxSchemafactory.

Grederei che System.setProperty() stia fallisce, o piuttosto non essere utilizzato correttamente.Secondo i documenti :

.

Tutte le proprietà del sistema e le variabili di ambiente sono private sulla tua applicazione.Impostazione di una proprietà di sistema influisce solo sulla visualizzazione dell'applicazione di quella proprietà, e non la visualizzazione di JVM.

Se SchemaAfractory fa parte del JDK (che penso sia), potresti non essere in grado di resettarlo.Tuttavia, potresti avere più fortuna impostare la proprietà del sistema nel tuo file Appconfig, poiché ciò potrebbe essere modificato in precedenza nella sequenza di avvio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top