2010-06-28 11 views
31

Android SDK के साथ, एक सादे खाली गतिविधि में निम्न कोड में विफल रहता है:स्कीमा फैक्ट्री प्लेटफार्म स्तर 8 में डब्ल्यू 3 सी एक्सएमएल स्कीमा का समर्थन नहीं करता है?

06-28 05:38:06.107: WARN/dalvikvm(495): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
06-28 05:38:06.128: ERROR/AndroidRuntime(495): FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.HelloWorldActivity}: java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
     at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:123) 
     at android.app.ActivityThread.main(ActivityThread.java:4627) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:521) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema 
     at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:194) 
     at com.example.HelloWorldActivity.onStart(HelloWorldActivity.java:26) 
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 
     at android.app.Activity.performStart(Activity.java:3781) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636) 
     ... 11 more 

Javadoc of SchemaFactory का उल्लेख है "मंच डिफ़ॉल्ट SchemaFactory एक में स्थित है:

@Override 
protected void onStart() { 
    super.onStart(); 

    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
} 

2,2 एमुलेटर logcat इस अपवाद से पता चलता कार्यान्वयन विशिष्ट तरीके। डब्ल्यू 3 सी एक्सएमएल स्कीमा के लिए प्लेटफ़ॉर्म डिफ़ॉल्ट स्कीमाफ़ैक्टरी होना चाहिए। "

+0

मेरे पास प्लेटफॉर्म स्तर 9 और 10 के साथ एक ही समस्या है। जैसा कि [इस उत्तर] द्वारा कहा गया है (http://stackoverflow.com/questions/801632/android-schema/802150#802150), ऐसा लगता है कि वर्तमान में कोई नहीं है एंड्रॉइड में एक्सएमएल स्कीमा समर्थन। –

+0

[इसी तरह दिखता है] (http://stackoverflow.com/questions/2694259/android-adt-eclipse-plugin-parsesdkcontent-failed) लेकिन उत्तर –

उत्तर

1

आप jarjar के साथ कुछ भाग्य फिर से पैकेजिंग xerces हो सकता है और उसके बाद

"org.apache.xerces.jaxp.validation.XMLSchemaFactory" 

गुजर

SchemaFactory.newInstance(String schemaLanguage, String factoryClassName, ClassLoader classLoader) 

को आप एपीआई का उपयोग कर रहे हैं> = 9 या सीधे instantiating

org.apache.xerces.jaxp.validation.XMLSchemaFactory 

यदि आप एपीआई 8 का उपयोग कर रहे हैं तो यह उस से पुराने एपीआई का उपयोग कर बिल्कुल काम नहीं कर सकता है।

2

मुझे एक ही समस्या थी और मुझे जवाब देने से पहले कई पोस्ट पढ़ीं जो मेरे लिए काम करती थीं। निरंतर संदर्भ दल्विक पर काम नहीं करेगा। मैंने पाया कि मुझे ज़ीरस-टू-एंड्रॉइड प्रोजेक्ट के साथ काम करने के लिए अपना कोड संशोधित करना पड़ा था, फिर मैं एक्सएमएल सत्यापन प्राप्त करने में सक्षम था। जो वैरिएबल संदर्भ द्वारा आप कर रहे हैं सबसे अधिक संभावना है। निम्नलिखित सेटअप के विवरण हैं और कुछ उदाहरण कोड दिखा रहे हैं कि एंड्रॉइड पर काम करने के सत्यापन को कैसे प्राप्त किया जाए।

निम्नलिखित मेरे लिए काम किया:

  1. एक सत्यापन उपयोगिता बनाएँ।
  2. एंड्रॉइड ओएस पर फ़ाइल में एक्सएमएल और एक्सएसडी दोनों प्राप्त करें और इसके खिलाफ सत्यापन उपयोगिता का उपयोग करें।
  3. सत्यापन करने के लिए Xerces-for-Android का उपयोग करें।

एंड्रॉयड कुछ संकुल का समर्थन है जो हम उपयोग कर सकते हैं करता है, मैं के आधार पर मेरे एक्सएमएल सत्यापन उपयोगिता बनाया: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/package-summary.html

मेरे प्रारंभिक सैंडबॉक्स परीक्षण जावा के साथ बहुत चिकनी थी, तो मैं इसे पोर्ट पर करने के लिए Dalvik करने की कोशिश की और पाया कि मेरा कोड काम नहीं करता है। कुछ चीजें सिर्फ दल्विक के साथ समर्थित नहीं हैं, इसलिए मैंने कुछ संशोधन किए हैं।

मैं एंड्रॉयड के लिए xerces के लिए एक संदर्भ पाया, तो मैं की मेरी सैंडबॉक्स परीक्षण संशोधित (निम्नलिखित एंड्रॉयड साथ काम नहीं करता है, इस के बाद उदाहरण करता है):

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; 
    } 
} 

ऊपर कोड था एंड्रॉइड के लिए xerces के साथ काम करने के लिए कुछ संशोधित करने के लिए (http://gc.codehum.com/p/xerces-for-android/)। आप SVN परियोजना प्राप्त करने की आवश्यकता, अनुसरण कर रहे हैं कुछ पालना नोट:

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 
ऊपर जार (अंततः मैं इसे एक जार में बना देंगे साथ

, बस इसे सीधे कॉपी किया त्वरित परीक्षण के लिए मेरे स्रोत में।

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; 
    } 
} 

कुछ साइड नोट्स::

आप भी ऐसा ही करना चाहते हैं, तो आप चींटी के साथ जल्दी से जार बना सकते हैं ( http://ant.apache.org/manual/using.html)), मैं अपने एक्सएमएल सत्यापन के लिए काम करने के लिए निम्नलिखित प्राप्त करने में सक्षम था

फ़ाइलें बनाने के लिए, मैं एक साधारण फ़ाइल उपयोगिता फ़ाइलों को स्ट्रिंग लिखने के लिए बनाया:

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(); 
    } 
} 

मैं भी एक क्षेत्र है कि मैं करने के लिए उपयोग किया था करने के लिए लिखने के लिए की जरूरत है, तो मैं का इस्तेमाल किया:

String path = this.getActivity().getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir; 

थोड़ा हैकिश, यह काम करता है। मुझे यकीन है कि ऐसा करने का एक और संक्षिप्त तरीका है, हालांकि मुझे लगा कि मैं अपनी सफलता साझा करूंगा, क्योंकि मुझे कोई अच्छा उदाहरण नहीं मिला था।

+0

ग्रेट लिखने में मदद नहीं करता, मैं विस्तार के स्तर की सराहना करता हूं इस – GMLewisII