2010-04-22 19 views
5

ऐसे कई प्रश्न हैं जो सर्वश्रेष्ठ एक्सएमएल पार्सर से पूछते हैं, मुझे एक्सएमएल पार्सर क्या है जो जावा के लिए ग्रोवी की तरह सबसे ज्यादा दिलचस्पी है?जावा में एक्सएमएल करने का एक बेहतर तरीका

मैं चाहता हूँ:

SomeApiDefinedObject o = parseXml(xml); 
for(SomeApiDefinedObject it : o.getChildren()) { 
    System.out.println(it.getAttributes()); 
} 

सबसे महत्वपूर्ण चीजें हैं कि मैं एक्सएमएल नोड के हर प्रकार के लिए एक वर्ग बनाने के लिए नहीं करना चाहते, मैं नहीं बल्कि सिर्फ स्ट्रिंग के रूप में उन सब के साथ सौदा करना चाहते हैं, और है कि XML का निर्माण किसी भी कन्वर्टर्स या कुछ भी आवश्यकता नहीं है, बस एक साधारण उद्देश्य यह है कि पहले से ही

आप ग्रूवी XML पार्सर का उपयोग किया है परिभाषित किया गया है, तो आप को पता चल जाएगा कि मैं क्या वैकल्पिक रूप से के बारे में

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

+0

@jboyd: यदि आप कहते हैं कि तुम वस्तुओं को बनाने के ... गति और स्मृति एक चिंता का विषय हैं, तो नहीं चाहते हैं और प्रमाणीकरण ** ** चिंता नहीं है, तो जैवोल्यूशन प्रोजेक्ट में सॉफ्ट-रीयलटाइम एक्सएमएल "स्टैक्स-जैसे" पार्सर है (मुझे इसके बारे में कुछ भी पता नहीं है, बस यह स्टैक्स जैसा है और इसका ध्यान गति, कम है पदचिह्न और बहुत कम वस्तुओं निर्माण)। – SyntaxT3rr0r

+1

मुझे आश्चर्य है कि क्या जावा-लैंड में LINQ-TO-XML की शक्ति के समान कुछ है? – ChaosPandion

+0

@WizardOfOdds: यह मुझे लगता है जैसे वह "ऑब्जेक्ट" लिखते समय वास्तव में "वर्ग" का मतलब था। –

उत्तर

4

यहाँ जल्दी कुछ आप Sun Java Streaming XML Parser

FileInputStream xmlStream = new FileInputStream(new File("myxml.xml")); 
    XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(xmlStream); 
    while(reader.hasNext()){ 
     reader.next(); 
     for(int i=0; i < reader.getAttributeCount(); i++) { 
      System.out.println(reader.getAttributeName(i) + "=" + reader.getAttributeValue(i)); 
     } 
    } 
+0

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

+0

यह उपयोगी है, लेकिन बिल्कुल वही नहीं जो मैं चाहता हूं, समस्या यह है कि एक्सएमएल मुझे वापस मिल जाएगा जटिल है, लेकिन मुझे केवल इसके छोटे हिस्से की आवश्यकता है ... इसलिए मैं एक्सएमएल हेरार्की को मिरर नहीं करना चाहता जावा कोड में, मैं इसे जादुई रूप से करना चाहता हूं, शायद – walnutmon

+0

@jboyd नाम वाले मानचित्रों का उपयोग करना: वास्तव में, यह वास्तव में कुछ उत्तरों में से एक है जहां आप वास्तव में नहीं करते हैं * नहीं * जावा कोड में एक्सएमएल पदानुक्रम को मिरर करना है। मेरा (और ब्रायन का अनपेक्षित रूप से हटाया गया) अन्य हैं। ये बिल्कुल आपके "मैं चाहता हूं" कोड की तरह काम करता हूं। –

0

मैं अत्यधिक JAXB की सलाह देता हूं। एक्सएमएल < -> जावा ऑब्जेक्ट्स फ्रेमवर्क के लिए बढ़िया।

0

नैनोएक्सएमएल नामक एक बहुत छोटा और सरल एक्सएमएल पार्सर होता था। ऐसा लगता है कि अब और विकसित नहीं किया जा सकता है, लेकिन यह अभी भी http://devkix.com/nanoxml.php

0

पर उपलब्ध है XStream के साथ मेरे अच्छे अनुभव हैं। यह काफी तेज़ है और जावा को/से एक्सएमएल से क्रमबद्ध और deserialize बिना स्कीमा और बहुत कम कोड यह बस काम करता है ™। जावा ऑब्जेक्ट पदानुक्रम जो बनाता है वह सीधे आपके एक्सएमएल को दर्पण करेगा।

+0

को संपादित करूंगा, तो यह वही है जो वह * नहीं चाहता ... * –

0

मैं ओटोम (ऑब्जेक्ट टू ऑब्जेक्ट मैपिंग) प्राप्त करने के लिए डोज़र और कैस्टर के साथ काम करता हूं।

1

ऐसा लगता है कि सभी आप चाहते हैं, एक सरल डोम एपीआई है जैसे dom4j द्वारा प्रदान के साथ कर सकते है। मानक लाइब्रेरी में वास्तव में पहले से ही एक डोम एपीआई (org.w3c.dom पैकेज) है, लेकिन यह केवल एपीआई है, इसलिए आपको एक अलग कार्यान्वयन की आवश्यकता है - साथ ही dom4j जैसे कुछ और उन्नत का उपयोग कर सकते हैं।

1

ग्रोवी का उपयोग करें।

ऐसा लगता है कि आपका प्राथमिक लक्ष्य ऑब्जेक्ट एक्सेसर्स के माध्यम से "प्राकृतिक" तरीके से डीओएम तक पहुंचने में सक्षम होना है, और जावा आपको कक्षाओं को परिभाषित किए बिना ऐसा करने नहीं देगा। ग्रोवी, क्योंकि यह "बतख टाइप किया गया है," आपको ऐसा करने की अनुमति देगा।

ग्रोवी का उपयोग न करने का एकमात्र कारण यह है कि (1) एक्सएमएल प्रसंस्करण आपके आवेदन का एक बहुत ही छोटा हिस्सा है, और/या (2) आपको अन्य लोगों के साथ काम करना है जो जावा में कड़ाई से प्रोग्राम करना चाहते हैं।

जो कुछ भी आप करते हैं, "बस उन सभी के साथ तारों के साथ सौदा करने का फैसला करें" का फैसला करें। एक्सएमएल एक साधारण प्रारूप नहीं है, और जब तक आप अंदर और बाहर की कल्पना नहीं जानते हैं, तो आपको यह सही नहीं होने की संभावना है। जिसका अर्थ है कि आपका एक्सएमएल स्पेक-कॉन्फॉर्मेंट पार्सर्स द्वारा खारिज कर दिया जाएगा।

3

मैं जावा में एक पार्सिंग एक्सएमएल बनाने के लिए लिखी गई छोटी खुली स्रोत लाइब्रेरी को लापरवाही से जोड़ना चाहता हूं।

Jinq2XML देखें।

http://code.google.com/p/jinq2xml/

कुछ नमूना कोड दिखाई देगा:

Jocument joc = Jocument.load(urlOrStreamOrFileName); 
joc.single("root").children().each(new Action() { 
    public void act(Jode j){ 
     System.out.println(j.name() + ": " + j.value()); 
    } 
}); 
+0

यह बहुत अच्छा लग रहा है! – boreas

+0

साझा करने के लिए धन्यवाद अभी भी xml पढ़ने के लिए है? क्या आपके पास ऐसा संस्करण है जो xml दस्तावेज़ को किसी तत्व में विशेषता जोड़ने जैसे संचालित कर सकता है? – boreas

+0

@boreas क्षमा करें, लेकिन यह अभी भी केवल पढ़ने की क्षमता है। – jjnguy

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