2012-03-20 40 views
5

Tôi cần xác thực xml lớn với giới hạn sử dụng bộ nhớ. Với mỗi mã tôi đã tìm thấy cho đến nay tôi nhận được ra khỏi lỗi bộ nhớ.Làm cách nào để xác thực xml lớn đối với lược đồ xsd?

Phương pháp tôi đã cố gắng:

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

// phương pháp 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); 

tôi nhận được OutOfMemory mỗi khi

EDIT

với 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))); 

vẫn sử dụng bộ nhớ là rất cao, cho 15mb xml - 250MB của đống stacktrace:

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) 

EDIT xml của tôi có chuỗi base64 lớn

Trả lời

3

Xem bài viết này về XML unmarshalling từ Marco Tedone see here. Dựa trên kết luận của ông, tôi khuyên bạn nên tiêu thụ bộ nhớ thấp STax:

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

Cảm ơn bạn đã trả lời. Điều này vẫn còn sử dụng xerces vì ​​vậy tôi vẫn nhận được OutOfMemory với '-Xmx250m'. Cho đến nay woodstox làm việc tốt nhất từ ​​tôi. – bunnyjesse112

0

Có thể là bộ nhớ đang được được sử dụng cho giản đồ, không phải tài liệu nguồn. Bạn chưa nói gì về lược đồ. Một số có thể sử dụng lượng bộ nhớ rất cao, ví dụ nếu bạn có các giá trị hữu hạn lớn của minOccurs hoặc maxOccurs trong mô hình nội dung của bạn. Tại điểm nào ngoại lệ bộ nhớ xuất hiện?

+0

Cảm ơn bạn đã trả lời. XSD có một số lượng min/max Occurs nhưng nó không phức tạp. Xml của tôi có chuỗi base64 và xem outofmemory trong 'AbstractStringBuilder' – bunnyjesse112

Các vấn đề liên quan