2009-06-05 10 views
10

का उपयोग कर प्रोग्रामेटिक एचटीएमएल डॉक्यूमेंट पीढ़ी क्या किसी को पता है कि बिना किसी स्ट्रिंग को बाहरी रूप से उत्पन्न करने और फिर इसे पार्स करने के लिए HTMLEditorKit # का उपयोग करने के बिना जावा में प्रोग्रामेटिक रूप से HTML दस्तावेज़ को जेनरेट करना है? दो कारण पूछते हैं:जावा

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

दूसरा, ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण के परिणामस्वरूप क्लीनर कोड हो सकता है।

मुझे यह भी उल्लेख करना चाहिए कि लाइसेंसिंग कारणों से, मैं जेवीएम के साथ भेजे गए किसी भी पुस्तकालय का उपयोग करने का सहारा नहीं ले सकता।

धन्यवाद, टॉम

+0

क्या हम HTML या XML से बात कर रहे हैं? –

+0

आपको जेनरेट करने वाले HTML को पार्स करने की आवश्यकता क्यों होगी? क्या आपको इनलाइन HTML डालने में सक्षम होने की आवश्यकता होगी जो अमान्य हो सकता है? –

+0

आपके प्रश्नों के लिए धन्यवाद: मिमीर्स: एचटीएमएल ओलिवर: क्षमा करें, मैंने यह स्पष्ट नहीं किया। अगर मैं आपके प्रश्न को सही ढंग से समझता हूं, तो मैं HTML से HTMLTocument (HTMLEditorKit # read का उपयोग करके) जेटीक्स्टपेन द्वारा प्रस्तुत किया जा रहा हूं। –

उत्तर

9

एक वस्तु उन्मुख दृष्टिकोण एक पुस्तकालय ECS कहा जाता है का उपयोग करें।

यह काफी सरल पुस्तकालय है, और उम्र के लिए नहीं बदला है। फिर फिर, एचटीएमएल 4.01 spec या तो नहीं बदला है;) मैंने ईसीएस का उपयोग किया है और केवल स्ट्रिंग्स या स्ट्रिंगबफर/स्ट्रिंगबिल्डर के साथ बड़े HTML टुकड़े उत्पन्न करने से कहीं बेहतर है।

छोटे उदाहरण:

Option optionElement = new Option(); 
optionElement.setTagText("bar"); 
optionElement.setValue("foo"); 
optionElement.setSelected(false); 

optionElement.toString() अब उपज होगा:

<option value='foo'>bar</option> 

पुस्तकालय दोनों HTML 4.0 और XHTML समर्थन करता है। एकमात्र चीज जिसने मुझे शुरुआत में परेशान किया बहुत था कि एक्सएचटीएमएल संस्करण से संबंधित कक्षाओं के नाम लोअरकेस अक्षर से शुरू हुए: option, input, a, tr, और इसी तरह, जो सबसे बुनियादी जावा सम्मेलनों के खिलाफ जाता है। लेकिन अगर आप एक्सएचटीएमएल का उपयोग करना चाहते हैं तो ऐसा कुछ है जिसका उपयोग आप कर सकते हैं; कम से कम मैंने किया, आश्चर्यजनक रूप से तेज़।

+0

बिल्कुल :-) गति –

+1

के लिए +1 टॉम सीधे लाइब्रेरी का उपयोग नहीं कर सकता है (हालांकि अपाचे लाइसेंस के साथ किसी को समस्या क्यों होगी मेरे लिए एक रहस्य है), लेकिन वह विचारों के लिए एपीआई देख सकता है। –

+0

हम्म, मुझे पूरा यकीन है कि "मैं JVM के साथ भेजे गए किसी भी पुस्तकालय का उपयोग करने का सहारा नहीं ले सकता" प्रश्न के मूल संस्करण में नहीं था! :) उस प्रतिबंध के साथ, जीबी (टेबलबिल्डर जैसे उपयोगिता वर्ग) और एडम पेन्टर (एक्सएमएलस्ट्रीमवाइटर) समाधान उचित प्रतीत होते हैं। – Jonik

1

आप कुछ एलिमेंट ऑब्जेक्ट को रेंडर() विधि के साथ बनाना चाहते हैं, और फिर उन्हें पेड़ की संरचना में इकट्ठा करना; एक विज़िट एल्गोरिदम के साथ आप फिर मान सेट करने के लिए आगे बढ़ सकते हैं और फिर पूरी चीज प्रस्तुत कर सकते हैं।

पीएस: क्या आपने कुछ टेम्पलेटिंग इंजन जैसे freemarker माना है?

+0

.. या अपाचे वेग? –

0

आप जेडॉम या एक्सोम या एक्सस्ट्रीम जैसी किसी भी सभ्य एक्सएमएल लाइब्रेरी का उपयोग कर सकते हैं। एचटीएमएल एक्सएमएल का सिर्फ एक विशेष मामला है।

या, आप जेएसपी या वेग जैसे सर्वर साइड जावा के लिए मौजूदा टेम्पलेटिंग इंजनों में से एक का उपयोग कर सकते हैं।

+0

तकनीकी रूप से, एचटीएमएल एक्सएमएल का एक विशेष मामला नहीं है। एक्सएचटीएमएल है। –

+0

एक्सएचटीएमएल (एक्स पर जोर) एक्सएमएल है। एचटीएमएल एसजीएमएल है। वे समान हैं लेकिन वास्तव में एक ही चीज़ नहीं हैं। सबसे मान्य एक्सएचटीएमएल भी वैध एचटीएमएल है, लेकिन सभी नहीं। –

+2

चूंकि इसका उपयोग जेडडिटरपेन में किया जा रहा है, इसलिए इसे HTML का एक रूप होना चाहिए जो फलक पढ़ सकता है। –

3

मुझे लगता है कि मैन्युअल रूप से स्ट्रिंगबिल्डर (या सीधे स्ट्रीम में) के माध्यम से अपना एचटीएमएल उत्पन्न करना आपके सबसे अच्छे विकल्प होने जा रहा है, खासकर यदि आप किसी बाहरी पुस्तकालय का उपयोग नहीं कर सकते हैं।

किसी बाहरी पुस्तकालयों का उपयोग करने में सक्षम नहीं होने के कारण, आप प्रदर्शन की बजाय विकास की गति के मामले में अधिक पीड़ित होंगे।

+1

+1 यह सबसे तेज़ है, और इस सवाल पर भी मेरे जवाब के अनुसार, गंभीरता पहलुओं को उपयोगिता निर्माता वर्गों में छिपाया जा सकता है। – JeeBee

7

मैं देखता हूं कि जेएसपी कैसे काम करता है - यानी, वे एक सर्वलेट में संकलित करते हैं जो मूल रूप से स्ट्रिंगबफर परिशिष्ट का एक बड़ा लंबा सेट है। टैग जावा कोड स्निपेट में संकलित भी होते हैं। यह गन्दा है, लेकिन बहुत तेज़ है, और जब तक आप टॉमकैट की कार्य निर्देशिका में नहीं जाते हैं तब तक आप कभी भी यह कोड नहीं देखते हैं।हो सकता है कि आप वास्तव में अपनी एचटीएमएल पीढ़ी को एक जेएसपी जैसे एचटीएमएल केंद्रित दृश्य से लूप के लिए अतिरिक्त टैग के साथ कोड करना चाहते हैं, और अपने प्रोजेक्ट के भीतर आंतरिक कोड संकलन इंजन और कंपाइलर का उपयोग करें।

वैकल्पिक रूप से, केवल एक उपयोगिता वर्ग में स्ट्रिंगबिल्डर के साथ सौदा करें जिसमें "ओपनटाग", "क्लोजटाग", "ओपनटागविथ एट्रिब्यूट्स", "स्टार्टटेबल", और इसी तरह के तरीकों के लिए विधियां हैं ... यह एक बिल्डर पैटर्न का उपयोग कर सकती है, और अपने कोड देखने की तरह होगा:

public static void main(String[] args) { 
    TableBuilder t = new TableBuilder(); 
    t.start().border(3).cellpadding(4).cellspacing(0).width("70%") 
     .startHead().style("font-weight: bold;") 
     .newRow().style("border: 2px 0px solid grey;") 
      .newHeaderCell().content("Header 1") 
      .newHeaderCell().colspan(2).content("Header 2") 
     .end() 
     .startBody() 
     .newRow() 
      .newCell().content("One/One") 
      .newCell().rowspan(2).content("One/Two") 
      .newCell().content("One/Three") 
     .newRow() 
      .newCell().content("Two/One") 
      .newCell().content("Two/Three") 
     .end() 
    .end(); 
    System.out.println(t.toHTML()); 
} 
+0

मैंने यहां एक टेबलबिल्डर का उपयोग किया क्योंकि मेरे पास कोड था, क्योंकि हमें किसी प्रोजेक्ट में HTML ईमेल में HTML तालिका को एम्बेड करने की आवश्यकता थी। लिखना मुश्किल नहीं है, लेकिन आपको खुले टैग और अपने वर्तमान स्थिति का ट्रैक रखने की आवश्यकता है। – JeeBee

2

javax.swing.text.html HTMLWriter और दूसरों के बीच HTMLDocument वर्ग है। मैंने उनका इस्तेमाल नहीं किया है। मैंने में उपयोग किया है .Net और यह वही करता है जो आप चाहते हैं, लेकिन जावा संस्करण समान नहीं हो सकता है। http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/text/html/HTMLWriter.html

इसके अलावा, मैं कल्पना नहीं कर सकते एक StringBuilder एक वस्तु परत के साथ निर्माण की तुलना में धीमी जा रहा है:

यहाँ डॉक है। ऐसा लगता है कि किसी ऑब्जेक्ट उन्मुख दृष्टिकोण को ऑब्जेक्ट ग्राफ़ बनाना होगा और फिर स्ट्रिंग का उत्पादन करना होगा। इस सामान के लिए कच्चे तारों का उपयोग न करने का मुख्य कारण यह है कि आप एन्कोडिंग त्रुटियों के साथ-साथ अन्य गलतियों को विकृत दस्तावेजों का उत्पादन करने के लिए सुनिश्चित हैं।

विकल्प 2: आप अपने पसंदीदा एक्सएमएल एपीआई का उपयोग कर सकते हैं और एक्सएचटीएमएल का उत्पादन कर सकते हैं।

4

एक्सएचटीएमएल से निपटने पर, मुझे जावा 6 के XMLStreamWriter इंटरफ़ेस का उपयोग करके बहुत सफलता मिली है।

OutputStream destination = ...; 
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); 
XMLStreamWriter xml = outputFactory.createXMLStreamWriter(destination); 

xml.writeStartDocument(); 
xml.writeStartElement("html"); 
xml.writeDefaultNamespace("http://www.w3.org/1999/xhtml"); 

xml.writeStartElement("head"); 
xml.writeStartElement("title"); 
xml.writeCharacters("The title of the page"); 
xml.writeEndElement(); 
xml.writeEndElement(); 

xml.writeEndElement(); 
xml.writeEndDocument(); 
1

ऐसा प्रतीत होता है कि आप पूरा कर सकते हैं कि क्या आप HTMLDocument.BlockElement और HTMLDocument.BlockElement वस्तुओं की प्रत्यक्ष निर्माण का उपयोग कर प्रयास कर रहे हैं। सिद्धांतों के रचनाकारों के पास एक हस्ताक्षर होता है जो कम से कम प्रत्यक्ष उपयोग संभव है।

मैं ओपनजेडीके में स्विंग स्रोतों की जांच करने का सुझाव दूंगा कि यह देखने के लिए कि पार्सर इसे कैसे संभालता है, और वहां से अपना तर्क प्राप्त करता है।

मैं यह भी सुझाव दूंगा कि यह अनुकूलन समयपूर्व हो सकता है, और शायद यह एक सरल दृष्टिकोण (यानी HTML टेक्स्ट जेनरेट करने) के लिए एक स्पीड-अनुकूलित प्रतिस्थापन होना चाहिए, अगर यह वास्तव में एप्लिकेशन में प्रदर्शन हॉटस्पॉट बन जाता है।

0

असल में आप डालने के तरीकों में से किसी एक का उपयोग करके अपने एचटीएमएल दस्तावेज़ में एचटीएमएल डाल सकते हैं, insertBeforeEnd(), insertAfterEnd(), insertBeforeStart(), insertAfterStart() डालें। आप उस एचटीएमएल के साथ विधि को आपूर्ति करते हैं जिसे आप सम्मिलित करना चाहते हैं और दस्तावेज़ पेड़ की स्थिति जिसे आप HTML डालना चाहते हैं।

उदाहरण के लिए।

doc.insertBeforeEnd (तत्व, एचटीएमएल);

HTMLDocument क्लास ने दस्तावेज़ पेड़ को पार करने के तरीकों को भी प्रदान किया।