एक एक्सएमएल स्ट्रीम है जिसे मुझे पार्स करने की आवश्यकता है। चूंकि मुझे केवल एक बार ऐसा करने की ज़रूरत है और मेरी जावा वस्तुओं का निर्माण करना है, एसएएक्स प्राकृतिक पसंद की तरह दिखता है। मैं डिफॉल्ट हैंडलर का विस्तार कर रहा हूं और स्टार्ट एलिमेंट, एंडलेमेंट और कैरेक्टर विधियों को कार्यान्वित कर रहा हूं, जिसमें मेरी कक्षा में सदस्य हैं जहां मैं वर्तमान पठन मूल्य (वर्ण विधि में लिया गया) सहेजता हूं।जावा सैक्स पार्सिंग
मुझे जो चाहिए वह करने में मुझे कोई समस्या नहीं है, लेकिन मेरा कोड काफी जटिल हो गया है और मुझे यकीन है कि इसके लिए कोई कारण नहीं है और मैं चीजों को अलग-अलग कर सकता हूं।
<players>
<player>
<id></id>
<name></name>
<teams total="2">
<team>
<id></id>
<name></name>
<start-date>
<year>2009</year>
<month>9</month>
</start-date>
<is-current>true</is-current>
</team>
<team>
<id></id>
<name></name>
<start-date>
<year>2007</year>
<month>11</month>
</start-date>
<end-date>
<year>2009</year>
<month>7</month>
</end-date>
</team>
</teams>
</player>
</players>
मेरे समस्या तब शुरू हुई जब मुझे एहसास हुआ कि एक ही टैग नाम फ़ाइल के कई क्षेत्रों में उपयोग किया जाता है: मेरी एक्सएमएल की संरचना कुछ इस तरह है। उदाहरण के लिए, एक खिलाड़ी और एक टीम दोनों के लिए आईडी और नाम मौजूद हैं। मैं अपने जावा क्लास प्लेयर और टीम के उदाहरण बनाना चाहता हूं। पार्सिंग करते समय, मैंने बुलियन झंडे को बताया कि मैं टीम के अनुभाग में हूं या नहीं, अंत में मुझे पता चलेगा कि नाम एक टीम का नाम है, न कि खिलाड़ी का नाम और इसी तरह।
यहाँ की तरह कैसे मेरे कोड दिखाई देता है:
public class MyParser extends DefaultHandler {
private String currentValue;
private boolean inTeamsSection = false;
private Player player;
private Team team;
private List<Team> teams;
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue = new String(ch, start, length);
}
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if(name.equals("player")){
player = new Player();
}
if (name.equals("teams")) {
inTeamsSection = true;
teams = new ArrayList<Team>();
}
if (name.equals("team")){
team = new Team();
}
}
public void endElement(String uri, String localName, String name) throws SAXException {
if (name.equals("id")) {
if(inTeamsSection){
team.setId(currentValue);
}
else{
player.setId(currentValue);
}
}
if (name.equals("name")){
if(inTeamsSection){
team.setName(currentValue);
}
else{
player.setName(currentValue);
}
}
if (name.equals("team")){
teams.add(team);
}
if (name.equals("teams")){
player.setTeams(teams);
inTeamsSection = false;
}
}
}
मेरा असली परिदृश्य में जब से मैं टीमों के अलावा में एक खिलाड़ी के लिए और अधिक नोड्स है और उन नोड्स भी नाम और आईडी की तरह टैग नहीं है, मैं अपने आप को गड़बड़ पाया इन ट्यूम्ससेक्शन के समान कई बूलियन के साथ और मेरी समाप्ति विधि कई स्थितियों के साथ लंबी और जटिल हो जाती है।
मुझे अलग-अलग क्या करना चाहिए? उदाहरण के लिए, मुझे कैसे पता चलेगा कि नाम टैग क्या है?
धन्यवाद!
मैं कहूंगा कि SAX का उपयोग 7 साल पहले प्राकृतिक विकल्प था। वर्तमान में प्राकृतिक विकल्प JAXB (या Xtream, या XmlBeans या JibX) – Tarlog
का उपयोग करना है कभी-कभी आपको मैन्युअल रूप से पार्सिंग करना पड़ता है। जब आप एक्सएमएल के मेगाबाइट्स से निपटते हैं तो इसे जावा ऑब्जेक्ट्स में परिवर्तित करना बहुत अच्छा विचार नहीं है। –
@ ʘleg - यदि आप एक एक्सएक्स XMLStreamReader से unmarshal ऑब्जेक्ट्स में JAXB का उपयोग करते हैं तो आप मेमोरी बाधाओं को प्रबंधित करने के लिए बड़े दस्तावेज़ के अनमर्शल उपखंडों को अनधिकृत कर सकते हैं। –