J'ai eu le même problème et lu de nombreux messages avant j'ai eu une réponse qui a fonctionné pour moi. La référence à la constante ne fonctionne pas sur Dalvik. J'ai trouvé, j'ai dû modifier mon code pour travailler avec la Xerces-pour-Android projet, puis j'ai été en mesure d'obtenir la validation du xml je recherchais. Qui est probablement ce que vous faites par la variable de référence. Voici les détails de l'installation et un exemple de code montrant comment obtenir la validation de travailler sur android.
Le suivant a fonctionné pour moi:
- Créer un utilitaire de validation.
- Obtenir à la fois le xml et xsd dans un fichier sur le système d'exploitation android et utiliser l'utilitaire de validation contre elle.
- Utilisation Xerces-Pour-Android pour procéder à la validation.
Android prend en charge certains paquets que l'on peut utiliser, j'ai créé mon xml utilitaire de validation basée sur: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/package-summary.html
Ma première sandbox test était assez lisse avec java, puis j'ai essayé de port à Dalvik et constaté que mon code ne fonctionne pas. Certaines choses ne sont pas pris en charge de même avec Dalvik, j'ai donc fait quelques modifications.
J'ai trouvé une référence à xerces pour android, j'ai donc modifié mon bac à sable test de (la suite ne fonctionne pas avec android, l'exemple après ce n'):
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.Document;
/**
* A Utility to help with xml communication validation.
*/
public class XmlUtil {
/**
* Validation method.
* Base code/example from: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/package-summary.html
*
* @param xmlFilePath The xml file we are trying to validate.
* @param xmlSchemaFilePath The schema file we are using for the validation. This method assumes the schema file is valid.
* @return True if valid, false if not valid or bad parse.
*/
public static boolean validate(String xmlFilePath, String xmlSchemaFilePath) {
// parse an XML document into a DOM tree
DocumentBuilder parser = null;
Document document;
// Try the validation, we assume that if there are any issues with the validation
// process that the input is invalid.
try {
// validate the DOM tree
parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = parser.parse(new File(xmlFilePath));
// create a SchemaFactory capable of understanding WXS schemas
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// load a WXS schema, represented by a Schema instance
Source schemaFile = new StreamSource(new File(xmlSchemaFilePath));
Schema schema = factory.newSchema(schemaFile);
// create a Validator instance, which can be used to validate an instance document
Validator validator = schema.newValidator();
validator.validate(new DOMSource(document));
} catch (Exception e) {
// Catches: SAXException, ParserConfigurationException, and IOException.
return false;
}
return true;
}
}
Le code ci-dessus, a dû être modifié certains à travailler avec xerces pour android (http://gc.codehum.com/p/xerces-for-android/). Vous avez besoin SVN du projet, les éléments suivants sont quelques-crèche notes:
download xerces-for-android
download silk svn (for windows users) from http://www.sliksvn.com/en/download
install silk svn (I did complete install)
Once the install is complete, you should have svn in your system path.
Test by typing "svn" from the command line.
I went to my desktop then downloaded the xerces project by:
svn checkout http://xerces-for-android.googlecode.com/svn/trunk/ xerces-for-android-read-only
You should then have a new folder on your desktop called xerces-for-android-read-only
Avec le au-dessus de la fiole (Finalement je vais faire dans un bocal, juste copié directement dans mon source pour des tests rapides. Si vous souhaitez faire de même, vous pouvez faire le pot rapidement avec Ant (http://ant.apache.org/manual/using.html)), j'ai été en mesure d'obtenir la suite de travailler pour ma validation xml:
import java.io.File;
import java.io.IOException;
import mf.javax.xml.transform.Source;
import mf.javax.xml.transform.stream.StreamSource;
import mf.javax.xml.validation.Schema;
import mf.javax.xml.validation.SchemaFactory;
import mf.javax.xml.validation.Validator;
import mf.org.apache.xerces.jaxp.validation.XMLSchemaFactory;
import org.xml.sax.SAXException;
/**
* A Utility to help with xml communication validation.
*/public class XmlUtil {
/**
* Validation method.
*
* @param xmlFilePath The xml file we are trying to validate.
* @param xmlSchemaFilePath The schema file we are using for the validation. This method assumes the schema file is valid.
* @return True if valid, false if not valid or bad parse or exception/error during parse.
*/
public static boolean validate(String xmlFilePath, String xmlSchemaFilePath) {
// Try the validation, we assume that if there are any issues with the validation
// process that the input is invalid.
try {
SchemaFactory factory = new XMLSchemaFactory();
Source schemaFile = new StreamSource(new File(xmlSchemaFilePath));
Source xmlSource = new StreamSource(new File(xmlFilePath));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlSource);
} catch (SAXException e) {
return false;
} catch (IOException e) {
return false;
} catch (Exception e) {
// Catches everything beyond: SAXException, and IOException.
e.printStackTrace();
return false;
} catch (Error e) {
// Needed this for debugging when I was having issues with my 1st set of code.
e.printStackTrace();
return false;
}
return true;
}
}
Quelques Remarques:
Pour la création des fichiers, j'ai fait un simple fichier utilitaire pour écrire chaîne de fichiers:
public static void createFileFromString(String fileText, String fileName) {
try {
File file = new File(fileName);
BufferedWriter output = new BufferedWriter(new FileWriter(file));
output.write(fileText);
output.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
J'ai aussi besoin de l'écrire pour une zone que j'ai eu accès, alors j'ai fait usage de:
String path = this.getActivity().getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir;
Un peu hackish, il fonctionne. Je suis sûr qu'il y est une nouvelle façon de faire cela, cependant j'ai pensé que je vous ferais partager mon succès, comme il n'y avait pas de bons exemples que j'ai trouvé.