2011-01-18 14 views
10

मैं निम्नलिखित जावा कोड है:एक रिश्तेदार पथ पर एक DTD स्कीमा के साथ एक XML फ़ाइल पार्स

 

DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc=db.parse(new File("/opt/myfile")); 
 

और /opt/myfile की तरह कुछ में शामिल हैं:

 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE archive SYSTEM "../../schema/xml/schema.dtd"> 
... 

मैं निम्नलिखित त्रुटि मिलती है:

 
java.io.FileNotFoundException: /../schema/xml/schema.dtd (No such file or directory) 

यह एक बड़ा जावा ढांचा है जो कहीं और उत्पादित एक एक्सएमएल फाइल का उपभोग करता है। मुझे लगता है कि सापेक्ष पथ समस्या है। मुझे नहीं लगता कि जेवीएम शुरू होने से पहले सीडब्ल्यूडी को बदलने के लिए स्वीकार्य होगा (पथ एक कॉन्फ़िगरेशन फ़ाइल से आता है जो JVM द्वारा स्वयं पढ़ा जाता है) और मुझे JVM चल रहा है, जबकि मुझे cwd को बदलने का कोई तरीका नहीं मिला है। मैं इस XML फ़ाइल को उपयुक्त डीटीडी के साथ कैसे पार्स करूं?

उत्तर

17

आपको डीटीडी के पथ को ट्विक करने के लिए कस्टम EntityResolver का उपयोग करने की आवश्यकता है ताकि यह पाया जा सके।

db.setEntityResolver(new EntityResolver() { 
    @Override 
    public InputSource resolveEntity(String publicId, String systemId) 
      throws SAXException, IOException { 
     if (systemId.contains("schema.dtd")) { 
      return new InputSource(new FileReader("/path/to/schema.dtd")); 
     } else { 
      return null; 
     } 
    } 
}); 

तो schema.dtd अपने classpath पर है, तो आप सिर्फ getResourceAsStream उपयोग कर सकते हैं पूरा पथ निर्दिष्ट किए बिना, यह लोड करने के लिए: उदाहरण के लिए:

return new InputSource(Foo.class.getResourceAsStream("schema.dtd")); 
+1

या वह एक कैटलॉग आधारित रिज़ॉल्वर का उपयोग कर सकता है। –

+0

रिज़ॉल्वर उदाहरण का उपयोग करने के लिए तैयार: [org.hibernate.util.DTDEntityResolver] (http://stackoverflow.com/questions/10886453/hibernate-issue-with-using-http-www-hibernate-org-dtd) – Vadzim

0

मैंने ऊपर दिए गए उदाहरण की तरह कस्टम एंटिटी रीसोलवर का उपयोग किया लेकिन यह अभी भी दूसरी मूल निर्देशिका में डीटीडी फ़ाइल की खोज की है। इसलिए मैंने इसे डीबग किया और फिर पता चला कि मुझे user.dir सिस्टम प्रॉपर्टी को बदलने की जरूरत है। इसलिए मैंने इस लाइन को अपने एप्लिकेशन प्रारंभिक विधि में जोड़ा और यह अब काम करता है।

System.setProperty("user.dir") 
संबंधित मुद्दे