如何在JavaSAX中解析这个XML?
我正在使用java中的SAX解析器。我不确定: 1) 这种情况下我需要什么课程?我猜我想要 课程(如果我的想法完全错误,请告诉我): -寄养家庭(包含家庭和子女的阵列列表) -族(包含子级的ArrayList和父级的字符串) -子项(包含ChildID的ArrayList) 2) 如何在startElement和endElement方法中处理这种情况 复杂的是由于ChildID同时出现在ChildList和RemainingChildList中。感谢任何能帮助我的人如何在JavaSAX中解析这个XML?,java,xml,Java,Xml,我正在使用java中的SAX解析器。我不确定: 1) 这种情况下我需要什么课程?我猜我想要 课程(如果我的想法完全错误,请告诉我): -寄养家庭(包含家庭和子女的阵列列表) -族(包含子级的ArrayList和父级的字符串) -子项(包含ChildID的ArrayList) 2) 如何在startElement和endElement方法中处理这种情况 复杂的是由于ChildID同时出现在ChildList和RemainingChildList中。感谢任何能帮助我的人 <FosterHome
<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>
快乐日托儿所
苹果街
亚当斯
孩子1
孩子2
亚当斯
孩子3
孩子4
孩子5
孩子6
如果您的文档很小,我要说的第一件事是:不要使用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.
班级寄养家庭{
字符串孤儿院;
ArrayList族=新的ArrayList();
ArrayList remainingChildren=新建ArrayList();
}
阶级家庭{
字符串父级;
ArrayList子项=新的ArrayList();
公共族(字符串_parent){parent=_parent;}
}
班童{
字符串id;
公共子(字符串_id){id=_id;}
}
等
然后,每当它看到打开和关闭标记时,就为SAX事件编写事件处理程序,这些标记跟踪当前打开的元素,在找到它们时向它们添加对象,并在找到关闭标记时关闭它们
这是一件烦琐的事情,但是在不同的地方都有很好的文档记录,比如在上。如果您的文档很小,我要说的第一件事是:不要使用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.
班级寄养家庭{
字符串孤儿院;
ArrayList族=新的ArrayList();
ArrayList remainingChildren=新建ArrayList();
}
阶级家庭{
字符串父级;
ArrayList子项=新的ArrayList();
公共族(字符串_parent){parent=_parent;}
}
班童{
字符串id;
公共子(字符串_id){id=_id;}
}
等
然后,每当它看到打开和关闭标记时,就为SAX事件编写事件处理程序,这些标记跟踪当前打开的元素,在找到它们时向它们添加对象,并在找到关闭标记时关闭它们
这是一项繁重的工作,但在不同的地方都有详细的文档记录,例如在上要处理来自不同父元素的ChildID元素,可以在分别为ChildList和RemainingChildList输入startElement()处理程序方法时保存当前状态。然后,当您为ChildID输入endElement()处理程序方法时,您将根据保存的状态处理当前的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());
}
}
import org.xml.sax.Attributes;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
导入org.xml.sax.XMLReader;
导入org.xml.sax.helpers.DefaultHandler;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.parsers.SAXParserFactory;
导入java.io.CharArrayReader;
导入java.io.CharArrayWriter;
导入java.io.IOException;
公共类XmlParser{
静态无效解析(字符串xml,处理程序)引发SAXException、ParserConfiguration异常、IOException
{
SAXParserFactory SAXParserFactory=SAXParserFactory.newInstance();
XMLReader reader=saxParserFactory.newSAXParser().getXMLReader();
setContentHandler(handler);
parse(新的InputSource(新的CharArrayReader(xml.toCharArray()));
}
静态类处理程序扩展了DefaultHandler{
CharArrayWriter内容=新的CharArrayWriter();
静态枚举状态{族,剩余}
国家;
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException
{
if(qName.equals(“ChildList”))
州=州。家庭;
else if(qName.equals(“RemainingChildList”))
状态=状态。剩余;
else if(qName.equals(“ChildID”))
contents.reset();
}
@凌驾
public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException
{
if(qName.equals(“ChildID”))
System.out.println(contents.toString();
}
@凌驾
公共无效字符(char[]ch,int start,int length)引发异常
{
内容。写入(ch、开始、长度);
}
}
公共静态void main(字符串[]args)引发异常
{
字符串xml=“\n”+
“快乐日托儿所\n”+
“苹果街\n”+
“\n”+
“\n”+
“Adams\n”+
“\n”+
“Child1\n”+
“Child2\n”+
“\n”+
“\n”+
“\n”+
“Adams\n”+
“\n”+
“Child3\n”+
“Child4\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“Child5\n”+
“Child6\n”+
“\n”+
"";
解析(xml,newhandler());
}
}
要处理来自不同父元素的ChildID元素,可以在输入startEle时保存当前状态