2012-03-28 7 views
5

मैं जावा 6 का उपयोग कर रहा हूं। मैं एक्सएचटीएमएल को पार्स करना चाहता हूं जो मुझे पता है कि अच्छी तरह से गठित है। इस प्रकार, मैं दस्तावेज़ में संदर्भित डीटीडी या अन्य स्कीमा के खिलाफ कोई सत्यापन नहीं करना चाहता हूं। हालांकि, मुझे यह पता लगाने में परेशानी हो रही है कि उस सत्यापन को कैसे बंद किया जाए। मैंDocumentBuilder.parse का उपयोग करके अच्छी तरह से गठित XML को पार्स करते समय मैं सत्यापन को कैसे बंद कर सकता हूं?

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setValidating(false); 
    final DocumentBuilder b = factory.newDocumentBuilder(); 
    final InputSource s = new InputSource(new StringReader(str)); 
    org.w3c.dom.Document result = b.parse(s); 

है लेकिन मैं अभी भी अंतिम पंक्ति पर एक अपवाद मिलता है ...

java.net.SocketException: Unexpected end of file from server 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:777) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640) 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:774) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1282) 
    at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:283) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1194) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1003) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) 
    at com.myco.myproj.util.XmlUtilities.getStringAsDocument(XmlUtilities.java:130) 
    at com.myco.myproj.util.NetUtilities.getUrlAsDocument(NetUtilities.java:30) 
    at com.myco.myproj.parsers.impl.AbstractChicagoReaderParser.parsePage(AbstractChicagoReaderParser.java:144) 
    at com.myco.myproj.parsers.impl.AbstractChicagoReaderParser.getEvents(AbstractChicagoReaderParser.java:112) 
    at com.myco.myproj.parsers.impl.ChicagoReaderParserTest.testParser(ChicagoReaderParserTest.java:29) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

मैं अपने पार्सर इंटरनेट के लिए जा नहीं करना चाहती। मैं इसे कैसे अक्षम कर सकता हूं? धन्यवाद, - डेव

संपादित करें: प्रति Traroth के सुझाव, मैं नीचे दिए गए कोड की कोशिश की, लेकिन एक ही अपवाद

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setValidating(false); 
    final DocumentBuilder builder = factory.newDocumentBuilder(); 
    builder.setEntityResolver(new EntityResolver() { 
     @Override 
      public InputSource resolveEntity(String publicId, String systemId) { 
        return null; 
      } 
     }); 
    final InputSource s = new InputSource(new StringReader(str)); 
    org.w3c.dom.Document result = builder.parse(s); 
+0

यदि आप प्रदर्शित या लॉग isValidating क्या होता है() DocumentBuilderFactory के लिए? –

उत्तर

2

शायद एक EntityResolver मुद्दे से संबंधित मिलता है। आप यहाँ एक बार देख ले सकते हैं:

How to read well formed XML in Java, but skip the schema?

+0

मुझे लगता है कि आप उस धागे में स्वीकृत उत्तर के बारे में बात कर रहे हैं। मैंने सुझाव की कोशिश की (मेरा कोड संपादन में शामिल है), लेकिन मुझे अभी भी एक ही अपवाद मिलता है। क्या मैं कुछ भूल रहा हूँ? – Dave

+1

@ डेव - हां। रिटर्निंग नल एक इकाई रिज़ॉल्वर को लागू नहीं करने जैसा ही है। आपको इनपुट स्रोत लौटने के दूसरे पथ का पालन करना होगा। अपनी एक्सएमएल फ़ाइल के लिए डीटीडी की सिस्टम आईडी में बस "foo.dtd" को बदलें। – Alohci

+0

हां, यदि आप उत्तर में नमूना कोड देखते हैं, तो आप देखेंगे कि resolEntity() विधि वास्तविक गैर-शून्य इनपुट स्रोत देता है यदि XML एक डीटीडी को संदर्भित करता है, और शून्य। –

4

यहाँ कैसे आप एक DocumentBuilder कि सभी बाहरी संदर्भित संस्थाओं पर ध्यान नहीं देगा, DTDs सहित पैदा करते हैं:

final DocumentBuilder builder = factory.newDocumentBuilder(); 
builder.setEntityResolver(new EntityResolver() { 
    @Override 
     public InputSource resolveEntity(String publicId, String systemId) { 
       // it might be a good idea to insert a trace logging here that you are ignoring publicId/systemId 
       return new InputSource(new StringReader("")); // Returns a valid dummy source 
     } 
    }); 
संबंधित मुद्दे

 संबंधित मुद्दे