2011-11-18 73 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