2012-03-20 5 views
5

मुझे सीमित स्मृति उपयोग के साथ बड़े xml को सत्यापित करने की आवश्यकता है। मैंने जो भी कोड पाया है, अब तक मुझे स्मृति त्रुटि से बाहर निकलना है।xsd schema के खिलाफ बड़े xml को कैसे सत्यापित करें?

तरीके मैं करने की कोशिश की:

//method 1 
     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(Thread.currentThread().getContextClassLoader().getResource("xmlresource/XSD_final2.xsd").getFile())})); 
     SAXParser parser = factory.newSAXParser(); 
     XMLReader reader = parser.getXMLReader(); 
     reader.setErrorHandler(new SimpleErrorHandler()); 
     reader.parse(new InputSource(inputXml)); 
//method2 

XMLValidationSchemaFactory sf = XMLValidationSchemaFactory.newInstance(XMLValidationSchema.SCHEMA_ID_W3C_SCHEMA); 
      XMLValidationSchema vs = sf.createSchema(Thread.currentThread().getContextClassLoader().getResource("xmlresource/XSD_final2.xsd")); 
      XMLStreamReader2 sr = (XMLStreamReader2) XMLInputFactory2.newInstance().createXMLStreamReader(new FileInputStream(inputXml)); 
      sr.validateAgainst(vs); 
      try { 
       while (sr.hasNext()) { 
       sr.next(); 
       } 
       System.out.println("Validated ok!"); 
      } catch (XMLValidationException ve) { 
       System.err.println("Validation problem: "+ve); 
       isValid = false; 
      } 
      sr.close(); 

// विधि 3

 SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
      String fileName = Thread.currentThread().getContextClassLoader().getResource("xmlresource/XSD_final2.xsd").getFile(); 

      Schema schema = factory.newSchema(new File(fileName)); 
      Validator validator = schema.newValidator(); 

      // create a source from a file 
      StreamSource source = new StreamSource(new File(inputXml)); 

      // check input 

      validator.validate(source); 

मैं OutOfMemory हर बार

संपादित

XOM साथ

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(Thread.currentThread().getContextClassLoader().getResource("xmlresource/XSD_final2.xsd").getFile())})); 
      SAXParser parser = factory.newSAXParser(); 
      XMLReader reader = parser.getXMLReader(); 
      reader.setErrorHandler(new SimpleErrorHandler()); 

      Builder builder = new Builder(reader); 
      builder.build(new FileInputStream(new File(inputXml))); 

अभी भी स्मृति के उपयोग 15mb एक्सएमएल के लिए, बहुत अधिक है - ढेर स्टैकट्रेस की 250MB:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:2367) 
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) 
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114) 
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535) 
at java.lang.StringBuffer.append(StringBuffer.java:322) 
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleCharacters(XMLSchemaValidator.java:1574) 
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.characters(XMLSchemaValidator.java:789) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:441) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
at nu.xom.Builder.build(Unknown Source) 
at nu.xom.Builder.build(Unknown Source) 

संपादित मेरे एक्सएमएल बड़े बेस 64 स्ट्रिंग है

उत्तर

3

मार्को टेडोन see here से XML unmarshalling पर इस आलेख को देखें। उसके निष्कर्ष मैं कम स्मृति की खपत StAX के लिए सिफारिश करेंगे के आधार पर:

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); 
    XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(fileInputStream); 
    Validator validator = schema.newValidator(); 
    validator.validate(new StAXSource(xmlStreamReader)); 
+1

में आउटफमेमरी को प्रतिक्रिया के लिए धन्यवाद। यह अभी भी xerces का उपयोग करता है, इसलिए मुझे अभी भी '-Xmx250m' के साथ आउटऑफमेमरी मिलती है। अब तक वुडस्टॉक्स ने मुझसे सबसे अच्छा काम किया है। – bunnyjesse112

0

यह संभव है कि स्मृति में किया जा रहा है स्कीमा के लिए इस्तेमाल किया, स्रोत दस्तावेज़ नहीं। आपने स्कीमा के बारे में कुछ भी नहीं कहा है। कुछ स्मृति की बहुत अधिक मात्रा का उपयोग कर सकते हैं, उदाहरण के लिए यदि आपके पास अपने सामग्री मॉडल में minOccurs या maxOccurs के बड़े परिमित मूल्य हैं। मेमोरी अपवाद के बाहर किस बिंदु पर होता है?

+0

प्रतिक्रिया के लिए धन्यवाद। एक्सएसडी में कुछ मिनट/अधिकतम होता है लेकिन यह जटिल नहीं है। मेरे एक्सएमएल में बेस 64 स्ट्रिंग है और 'AbstractStringBuilder' – bunnyjesse112