如何在Java SAX中解析此XML?
我在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>
为了处理证据充分的childID的从不同的父元素元素,你可以保存当前状态下进入的startElement()处理器方法分别为ChildList和RemainingChildList。然后,当你进入的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());
}
}
如果你的文件小,我想说的第一件事是:不使用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
我完全同意,如果它很小,使用DOM! 非常干净 – TrewTzu
您选择使用SAX解析东西的方式取决于你想要达到的目的。这个问题没有足够的细节来真正提供任何帮助。 – Gian
我想实现一个FosterHome类,在那里我可以访问存储在下面的Child的所有信息。感谢您指出,家庭标记现已关闭。 – Rolando