2009-07-07 13 views
7

का उपयोग करते समय डीटीडी डाउनलोड को रोकें मुझे एक्सएमएल फाइलों को संसाधित करना है जिनमें जावा में एक्सएसएलटी के साथ डीटीडी है। डीटीडी वास्तव में जरूरी है क्योंकि इसमें उपयोग की जाने वाली संस्थाओं की परिभाषाएं शामिल हैं। (एक तरफ: हाँ, यूनिकोड का उपयोग करने वाली सामग्री के लिए इकाइयों का उपयोग करना एक बुरा विचार है ;-)एक्सएसएलटी यानी एक्सएमएल ट्रांसफार्मर

जब मैं रूपांतरण चलाता हूं तो यह हर बार बाह्य स्रोत से डीटीडी डाउनलोड करता है। मैं इसे DTDs कैश करने के लिए एक एक्सएमएल सूची का उपयोग करना चाहते तो मैं TransformerFactory दिया एक CatalogResolver रूप URIResolver:

URIResolver cr = new CatalogResolver(); 
tf = TransformerFactory.newInstance(); 
tf.setURIResolver(cr); 
Transformer t = tf.newTransformer(xsltSrc); 
t.setURIResolver(cr); 
Result res = new SAXResult(myDefaultHandler()); 
t.transform(xmlSrc, res); 

लेकिन जब मैं परिवर्तन यह अभी भी नेटवर्क पर DTDs डाउनलोड करता है चलाते हैं। (या तो जावा 5 या स्टैंडअलोन या सैक्सन और जेरसेस का उपयोग करने के रूप में यालान और जेरसेस का उपयोग करना।)

डीटीडी की स्थानीय प्रतिलिपि का उपयोग करने के लिए परिवर्तन को मजबूर करने के लिए क्या किया जाता है?

उत्तर

10

(मैं अपने ही सवाल का जवाब दे रहा हूँ यहाँ मुझे अगली बार को बचाने के लिए, या किसी और, फेरबदल के दिनों मैं जवाब खोजने के लिए की जरूरत है।)

क्या यह वास्तव में जिस तरह से DTDs हैं बदलने की जरूरत हल किया गया EntityResolver है। दुर्भाग्य से Transformer द्वारा उपयोग किए जाने के लिए EntityResolver सेट करना संभव नहीं है। तो अगर आप अपने EntityResolver रूप CatalogResolver साथ XMLReader पहले एक बनाने के लिए:

SAXParserFactory spf = SAXParserFactory.newInstance(); 
spf.setNamespaceAware(true); 
XMLReader r = spf.newSAXParser().getXMLReader(); 
EntityResolver er = new CatalogResolver(); 
r.setEntityResolver(er); 

और Transformer के लिए उस में का उपयोग करें:

SAXSource s = new SAXSource(r, xmlSrc); 
Result res = new SAXResult(myDefaultHandler()); 
transformer.transform(s, res); 
+0

+1 अपने आप को हल करने और परिणाम साझा करने के लिए +1 (जैसा कि मैंने भी देखा है, जिसे मैंने भी देखा है)। – Tomalak

3

आप Xerces में कार्यक्षमता के इस प्रकार निष्क्रिय करने के लिए इस कोड का उपयोग कर सकते हैं :

org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader(); 
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

यह कोड नमूना डोम 4j का उपयोग करता है, लेकिन इसी तरह की "सेट फीचर" कार्यक्षमता अन्य जावा एक्सएमएल लिब्रा में मौजूद है जेडीओएम जैसे रिज।

+1

http://xerces.apache.org/xerces2-j/features.html स्पष्ट रूप से उन विशेषताओं को प्रस्तुत करते हैं। – PypeBros

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