2011-11-18 71 views
0

我在java中使用SAX解析器。我不確定:如何在Java SAX中解析此XML?

1)這種情況需要哪些類型?我猜我想要 類(請讓我知道如果我的想法是完全錯誤的): -FosterHome(包含一個家庭和兒童的Arraylist) -Family(包含ArrayList爲子和一個字母從父母) - 兒童(含ArrayList中的childID的)

2)如何處理在的startElement和endElement方法

這種情況什麼複雜是因爲出現在雙方的childList和RemainingChildList的childID的。感謝任何能夠幫助我的人。

<FosterHome> 
<Orphanage>Happy Days Daycare</Orphanage> 
<Location>Apple Street</Location> 
<Families> 
    <Family> 
     <Parent>Adams</ParentID> 
     <ChildList> 
      <ChildID>Child1</ChildID> 
      <ChildID>Child2</ChildID> 
     </ChildList> 
    </Family> 
    <Family> 
     <Parent>Adams</ParentID> 
     <ChildList> 
      <ChildID>Child3</ChildID> 
      <ChildID>Child4</ChildID> 
     </ChildList> 
    </Family> 
</Families> 
<RemainingChildList> 
<ChildID>Child5</ChildID> 
<ChildID>Child6</ChildID> 
</RemainingChildList> 
</FosterHome> 

+0

您選擇使用SAX解析東西的方式取決於你想要達到的目的。這個問題沒有足夠的細節來真正提供任何幫助。 – Gian

+0

我想實現一個FosterHome類,在那裏我可以訪問存儲在下面的Child的所有信息。感謝您指出,家庭標記現已關閉。 – Rolando

回答

1

爲了處理證據充分的childID的從不同的父元素元素,你可以保存當前狀態下進入的startElement()處理器方法分別爲ChildListRemainingChildList。然後,當你進入的endElement()childID的處理方法,你處理當前根據保存的狀態childID的(例如填充在FosterHome類相應的字段)。

例如:

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParserFactory; 

import java.io.CharArrayReader; 
import java.io.CharArrayWriter; 
import java.io.IOException; 

public class XmlParser { 

static void parse(String xml, Handler handler) throws SAXException, ParserConfigurationException, IOException 
{ 
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
    XMLReader reader = saxParserFactory.newSAXParser().getXMLReader(); 
    reader.setContentHandler(handler); 
    reader.parse(new InputSource(new CharArrayReader(xml.toCharArray()))); 
} 

static class Handler extends DefaultHandler { 

    CharArrayWriter contents = new CharArrayWriter(); 

    static enum STATE { Family, Remaining } 
    STATE state; 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 
    { 
     if (qName.equals("ChildList")) 
      state = STATE.Family; 
     else if (qName.equals("RemainingChildList")) 
      state = STATE.Remaining; 
     else if (qName.equals("ChildID")) 
      contents.reset(); 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException 
    { 
     if (qName.equals("ChildID")) 
      System.out.println(contents.toString() + " [" + state + "]"); 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException 
    { 
     contents.write(ch, start, length); 
    } 
} 

public static void main(String[] args) throws Exception 
{ 
    String xml = "<FosterHome>\n" + 
     "<Orphanage>Happy Days Daycare</Orphanage>\n" + 
     "<Location>Apple Street</Location>\n" + 
     "<Families>\n" + 
     " <Family>\n" + 
     "  <ParentID>Adams</ParentID>\n" + 
     "  <ChildList>\n" + 
     "   <ChildID>Child1</ChildID>\n" + 
     "   <ChildID>Child2</ChildID>\n" + 
     "  </ChildList>\n" + 
     " </Family>\n" + 
     " <Family>\n" + 
     "  <ParentID>Adams</ParentID>\n" + 
     "  <ChildList>\n" + 
     "   <ChildID>Child3</ChildID>\n" + 
     "   <ChildID>Child4</ChildID>\n" + 
     "  </ChildList>\n" + 
     " </Family>\n" + 
     "</Families>\n" + 
     "<RemainingChildList>\n" + 
     "<ChildID>Child5</ChildID>\n" + 
     "<ChildID>Child6</ChildID>\n" + 
     "</RemainingChildList>\n" + 
     "</FosterHome>"; 

    parse(xml, new Handler()); 
} 
} 
2

如果你的文件小,我想說的第一件事是:不使用SAX解析器使用DOM解析器來代替。

如果您的文檔很大,或者「實時」讀取,請使用SAX解析器。 SAX解析器的缺點是你有責任提供與XML等價的代碼,所以如果你想讓每個元素都在它自己的對象中,你將不得不自己定義所有這些類。

class FosterHome { 
    String orphanage; 
    ArrayList<Family> families = new ArrayList<Family>(); 
    ArrayList<Child> remainingChildren = new ArrayList<Child>(); 
} 

class Family { 
    String parent; 
    ArrayList<Child> children = new ArrayList<Child>(); 
    public Family(String _parent) { parent = _parent; } 
} 

class Child { 
    String id; 
    public Child(String _id) { id = _id;} 
} 

etc. 

,然後寫了SAX事件的事件處理程序,只要自己認爲打開和關閉標籤,跟蹤哪些當前打開的元素,因爲他們發現,將對象添加到它們,並關閉它們關閉截至收盤標籤被找到。

這是一個苦差事,但在不同的地方,如http://totheriver.com/learn/xml/xmltutorial.html

+0

我完全同意,如果它很小,使用DOM! 非常乾淨 – TrewTzu