2011-11-10 16 views
10

पार्स करते समय डीटीडी को अनदेखा करना XOM xml लाइब्रेरी के साथ फ़ाइल को पार्स करते समय मैं डीटीडी घोषणा को अनदेखा कैसे कर सकता हूं। मेरे फ़ाइल निम्न लाइन है:एक्सएमएल

<?xml version="1.0"?> 
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd"> 
//rest of stuff here 

और जब मैं निर्माण करने के लिए() अपने दस्तावेज़ की कोशिश मैं DTD फ़ाइल के लिए कोई filenotfound अपवाद मिलता है। मुझे पता है कि मेरे पास यह फ़ाइल नहीं है और मुझे इसकी परवाह नहीं है, तो एक्सओएम का उपयोग करते समय इसे कैसे हटाया जा सकता है?

public BlastXMLParser(String filePath) { 
    Builder b = new Builder(false); 
    //not a good idea to have exception-throwing code in constructor 
    try { 

     _document = b.build(filePath); 
    } catch (ParsingException ex) { 
     Logger.getLogger(BlastXMLParser.class.getName()).log(Level.SEVERE,"err", ex); 
    } catch (IOException ex) { 
     // 
    } 

private Elements getBlastReads() { 
    Element root = _document.getRootElement(); 
    Elements rootChildren = root.getChildElements(); 

    for (int i = 0; i < rootChildren.size(); i++) { 
     Element child = rootChildren.get(i); 
     if (child.getLocalName().equals("BlastOutput_iterations")) { 

      return child.getChildElements(); 
     } 
    } 

    return null; 
} 
} 

मैं इस लाइन पर एक NullPointerException मिलती है::

कोड स्निपेट है

Element root = _document.getRootElement(); 
DTD लाइन स्रोत एक्सएमएल फ़ाइल से हटा दिया मैं इसे सफलतापूर्वक पार्स कर सकते हैं के साथ

, लेकिन इस अंतिम उत्पादन प्रणाली में एक विकल्प नहीं है।

+0

क्या आप पार्स करने के लिए उपयोग किए गए 'कोड' को दिखा सकते हैं? – bbaja42

उत्तर

-4

उनके दस्तावेज़ीकरण के अनुसार यह किसी भी सत्यापन के बिना दस्तावेज़ को पार्स करने का तरीका है।

try { 
    Builder parser = new Builder(); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. How embarrassing!"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

आप XML स्कीमा मान्य करने के लिए चाहते हैं, तो आप new Builder(true) कॉल करनी होगी:

try { 
    Builder parser = new Builder(true); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ValidityException ex) { 
    System.err.println("Cafe con Leche is invalid today. (Somewhat embarrassing.)"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. (How embarrassing!)"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

वेतन ध्यान है कि अब अभी तक एक अपवाद फेंका जा सकता है: ValidityException

+1

कृपया मेरे कोड स्निपेट को देखें। दस्तावेज़ीकरण में जो भी लिखा गया है, उसके बाद भी मैं इसे – LordDoskias

13

पसंदीदा समाधान होगा एक EntityResolver लागू करें जो डीटीडी के लिए अनुरोधों को रोकता है और इन्हें एक एम्बेडेड प्रतिलिपि पर रीडायरेक्ट करता है। यदि आप

  1. और
  2. DTD के लिए पहुँच नहीं है बिल्कुल यकीन है कि आप इसकी आवश्यकता नहीं होगी और
  3. (अलग मान्यता से यह भी चरित्र संस्थाओं उस दस्तावेज़ में उपयोग किया जाता है की घोषणा हो सकती है) कर रहे हैं आप Xerces XML पार्सर कार्यान्वयन

का उपयोग कर रहे हैं, आप संबंधित SAX सुविधा सेट करके डीटीडी को लाने में अक्षम कर सकते हैं। एक्सओएम में इस तरह बिल्डर कन्स्ट्रक्टर को XMLReader पास करके यह संभव होना चाहिए:

import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.XMLReaderFactory; 

... 

XMLReader xmlreader = XMLReaderFactory.createXMLReader(); 
xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
Builder builder = new Builder(xmlreader); 
+0

पर काम नहीं कर सकता यह अन्यथा काम करता है अन्यथा मेरे xmlreader को यह देखने के बाद हमेशा लटका दिया जाता है कि DOCTYPE घोषणा –