2009-10-30 15 views
7

को absolutized होने से EntityResolver # resolveEntity में 'systemid' (स्ट्रिंग publicId, स्ट्रिंग systemid) को रोकने के लिए मैं इसे कैसे में सभी संस्थाओं के समाधान के लिए निम्न XML दस्तावेज़ पार्स करने के लिए करना चाहते हैं:जावा: वर्तमान कार्यशील निर्देशिका

<!DOCTYPE doc SYSTEM 'mydoc.dtd'> 
<doc>&title;</doc> 

मेरे EntityResolver डेटाबेस से दी प्रणाली आईडी के साथ बाहरी संस्था लाने के लिए माना जाता है और उसके बाद संकल्प, समझ के लिए नीचे देख पा रहे हैं:

private static class MyEntityResolver 
{ 
    public InputSource resolveEntity(String publicId, String systemId) 
     throws SAXException, IOException 
    { 
     // At this point, systemId is always absolutized to the current working directory, 
     // even though the XML document specified it as relative. 
     // E.g. "file:///H:/mydoc.dtd" instead of just "mydoc.dtd" 
     // Why??? How can I prevent this??? 

     SgmlEntity entity = findEntityFromDatabase(systemId); 
     InputSource is = new InputSource(new ByteArrayInputStream(entity.getContents())); 
     is.setPublicId(publicId); 
     is.setSystemId(systemId); 
     return is; 
    } 
} 

मैं दोनों का उपयोग कर डोम (DocumentBuilder) और SAX (XMLReader) की कोशिश की , इकाई रिज़ॉल्वर को MyEnt पर सेट करें ItyResolver (यानी। setEntityResolver(new MyEntityResolver())), लेकिन systemIdMyEntityResolver#resolveEntity(String publicId, String systemId) में हमेशा मौजूदा कार्य निर्देशिका के लिए पूर्ण किया जा रहा है।

मैंने setFeature("http://xml.org/sax/features/resolve-dtd-uris", false); पर कॉल करने का भी प्रयास किया, लेकिन इससे कुछ भी मदद नहीं मिली।

तो मैं जो चाहता था उसे प्राप्त कैसे कर सकता हूं?

धन्यवाद!

उत्तर

7

जाहिर है, EntityResolver2 नामक एक और इंटरफ़ेस है जो पुराने EntityResolver का विस्तार है। (भ्रमित नामों के बारे में बात करें!)

वैसे भी, मैंने पाया कि EntityResolver2 जो मैं चाहता था उसे प्राप्त किया, यानी, यह systemId में कोई भी परिवर्तन नहीं करता है, इसलिए यह हमेशा XML दस्तावेज़ में निर्दिष्ट किया गया था।

0

the EntityResolver Javadocs से:

प्रणाली पहचानकर्ता एक URL है, तो SAX पार्सर आवेदन करने के लिए यह रिपोर्ट करने से पहले पूरी तरह से इसे हल करना होगा।

यह EntityResolver.resolveEntity() है, जो घोषणाओं रिपोर्ट करने के लिए नहीं किया जाता है पर लागू नहीं होता:

इसके अलावा, org.xml.sax docs इस संकल्प-DTD-यूआरआई सुविधा के बारे में कहना है। ..

मुझे लगता है कि आपको या तो अपने बेस-यूआरआई को उस चीज़ पर सेट करना है जो आप रह सकते हैं, या सिस्टम-आईडी के बजाय सार्वजनिक आईडी का उपयोग कर सकते हैं।

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