2011-06-13 6 views
9

में स्थानीय डीटीडी का जिक्र करते हुए मेरे पास कुछ एक्सएमएल है जो मैं जावा में एक सैक्स पार्सर के साथ पार्स कर रहा हूं। यह इस प्रस्तावना से शुरू होता है:जावा

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd"> 

मैं स्थानीय डीटीडी का उपयोग करने के लिए इसे कैसे बदलूं?

मुझे लगता है मैं कुछ इस तरह कर सकता है:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "file:///c:/MathML/mathml3.dtd"> 

वास्तव में उस तरह नहीं है, लेकिन कुछ उस तरह। हालांकि, मुझे उपयोगकर्ता के सिस्टम से स्वतंत्र होने के मार्ग की आवश्यकता है।

मैं कक्षा पथ से संबंधित पथ के साथ स्थानीय डीटीडी का उपयोग कैसे करूं?

+1

संभवत: इस सवाल को देखने के लिए उपयोगी: http://stackoverflow.com/questions/243728/how-to-disable-dtd-at-runtime-in-javas -xpath –

+0

एक और संभावना है कि एक एक्सएमएल कैटलॉग का उपयोग करना जो एक्सएमएल को बदलने के बिना स्थानीय फ़ाइल में डक्ट टाइप को हल करता है। यह पार्सर आमंत्रण में पैरामीटर में परिवर्तन को धक्का देता है। –

उत्तर

5

अपने XML स्रोत को संशोधित किए बिना स्थानीय रूप से डीटीडी को हल करने के लिए XML कैटलॉग का उपयोग करने पर this article पर एक नज़र डालें। बुनियादी कदम हैं:

  1. कि स्थानीय DTDs करने के लिए सिस्टम आईडी नक्शे एक XML फ़ाइल
  2. का दृष्टांत और एक CatalogResolver
  3. कॉन्फ़िगर करने के लिए एक्सएमएल रीडर (पार्सर से प्राप्त) करने के लिए CatalogResolver प्रदान अपने कोड को संशोधित बनाने
1

आप इस तरह के रूप में संबंधित पथ का उपयोग कर सकते हैं:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "MathML/mathml3.dtd"> 

इस निर्देशिका है जहाँ आप जावा प्रोग्राम चल रहे हैं और पार्सर प्रयोग कर रहे हैं पर निर्भर करता है के सापेक्ष हो जाएगा, इसके बारे में निर्देशिका के सापेक्ष हो सकता है एक्सएमएल आप पार्सिंग कर रहे हैं।

4

जब वेब Apps के साथ काम, आप lib फ़ोल्डर में डाल दिया और DTD तरह यह उल्लेख कर सकते हैं:

<!DOCTYPE name PUBLIC 
    "-//CMP//DTD dtdName 1.0//EN" 
     "/WEB-INF/lib/dtdName.dtd"> 
+0

यह पहला जवाब से आसान है !! धन्यवाद हिथम – mounaim

+0

यह आसान है लेकिन यह सिर्फ एक कामकाज है –

+1

मैंने उत्तर को वेब ऐप समाधान के रूप में पोस्ट किया है, सादगी के लिए नहीं –

1

इसके अलावा एक और तरीका स्थानीय होस्ट पर DTD रखने के लिए किया जा सकता है ताकि अंतिम पथ की तरह कुछ हो जाता है: काम करता है

<!DOCTYPE hibernate-configuration SYSTEM 
      "http://localhost/hibernate-configuration-3.0.dtd"> 

निश्चित रूप से नहीं सबसे सुरुचिपूर्ण समाधान लेकिन निश्चित रूप से।

+0

हैकी लेकिन काम करता है, यदि आपके पास एक है (स्थानीयहोस्ट: 8080) – Mohammad

3

समाधान क्लासपाथ का उपयोग कर सिस्टम में डीटीडी फ़ाइल स्थान प्रदान करना है। तो doctype कि ऑफ़लाइन काम किया होगा:

<!DOCTYPE hibernate-configuration SYSTEM 
    "classpath://org/hibernate/hibernate-configuration-3.0.dtd"> 
+0

यह केवल विशेष [org.hibernate.util.DTDEntityResolver] के साथ काम करता है (http://stackoverflow.com/questions/10886453/hibernate -issue-साथ-का उपयोग कर-http-www-हाइबरनेट-संगठन-DTD)। – Vadzim