2010-02-21 12 views
5

मैं इस समारोह है विफल रहता है:Tagsoup एक StringReader (जावा) से एचटीएमएल दस्तावेज़ को पार्स करने

private Node getDOM(String str) throws SearchEngineException { 

       DOMResult result = new DOMResult(); 

       try { 
         XMLReader reader = new Parser(); 
         reader.setFeature(Parser.namespacesFeature, false); 
         reader.setFeature(Parser.namespacePrefixesFeature, false); 
         Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
         transformer.transform(new SAXSource(reader,new InputSource(new StringReader(str))), result); 
       } catch (Exception ex) { 
         throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage()); 
       } 

       return result.getNode(); 
     } 

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

जब मैं उपरोक्त विधि का एक अतिभारित संस्करण का उपयोग करें:

private Node getDOM(URL url) throws SearchEngineException { 

       DOMResult result = new DOMResult(); 

       try { 
         XMLReader reader = new Parser(); 
         reader.setFeature(Parser.namespacesFeature, false); 
         reader.setFeature(Parser.namespacePrefixesFeature, false); 
         Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
         transformer.transform(new SAXSource(reader, new InputSource(url.openStream())), result); 
       } catch (Exception ex) { 
         throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage()); 
       } 

       return result.getNode(); 
     } 

तो सब कुछ ठीक काम करता है - मैं एक उचित डोम पेड़ मिलता है, लेकिन मैं किसी भी तरह सर्वर से पोस्ट जवाब को पुनः प्राप्त करने की जरूरत है।

फ़ाइल में स्ट्रिंग को संग्रहीत करना और इसे वापस पढ़ना काम नहीं करता है - अभी भी वही परिणाम प्राप्त हो रहा है।

समस्या क्या हो सकती है?

उत्तर

0

POST प्रतिक्रिया प्राप्त करने के लिए आपको सबसे पहले एक POST अनुरोध करने की आवश्यकता है, new InputSource(url.openStream()) शायद एक कनेक्शन खोलता है और एक जीईटी अनुरोध से प्रतिक्रिया पढ़ता है। Sending a POST Request Using a URL देखें।

अन्य संभावनाओं कि पोस्ट अनुरोध कर रहे हैं और प्रतिक्रिया प्राप्त करने के लिए बाहर की जाँच करने के लिए दिलचस्प हो सकता है:

1

यह शायद एक्सएमएल एन्कोडिंग के साथ एक समस्या है?

1

यह एक एन्कोडिंग समस्या की तरह लगता है। आपके कोड के उदाहरण में जो काम नहीं करता है, आप यूआरएल को कन्स्ट्रक्टर में स्ट्रिंग के रूप में पास कर रहे हैं, जो इसे सिस्टम आईडी के रूप में उपयोग करता है, और आपको एचटीएमएल को पार्सिंग के साथ टैग्सपॉप्स में समस्याएं मिलती हैं। उदाहरण में जो काम करता है आप स्ट्रीम आउटपुट कन्स्ट्रक्टर में स्ट्रीम पास कर रहे हैं। अंतर यह है कि जब आप स्ट्रीम में जाते हैं तो SAX कार्यान्वयन स्ट्रीम से एन्कोडिंग को समझ सकता है।

आप इस परीक्षण आप इन चरणों की कोशिश कर सकते करना चाहते हैं:

  • स्ट्रीम एचटीएमएल आप एक java.io.InputStreamReader के माध्यम से कर रहे हैं और पार्स करने एन्कोडिंग क्या यह पता लगाता है देखने के लिए उस पर getEncoding कहते हैं।
  • अपने पहले उदाहरण कोड में, inputStreamReader की एन्कोडिंग में पास इनपुट इनपुट पर सेट एन्कोडिंग को कॉल करें।
  • देखें कि पहला उदाहरण, एन्कोडिंग को स्पष्ट रूप से सेट करने के लिए बदल गया है, एचटीएमएल को सही ढंग से पार करता है।

using the SAX InputSource पर एक लेख के अंत में इसकी चर्चा है।

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