Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaSAX中解析这个XML?_Java_Xml - Fatal编程技术网

如何在JavaSAX中解析这个XML?

如何在JavaSAX中解析这个XML?,java,xml,Java,Xml,我正在使用java中的SAX解析器。我不确定: 1) 这种情况下我需要什么课程?我猜我想要 课程(如果我的想法完全错误,请告诉我): -寄养家庭(包含家庭和子女的阵列列表) -族(包含子级的ArrayList和父级的字符串) -子项(包含ChildID的ArrayList) 2) 如何在startElement和endElement方法中处理这种情况 复杂的是由于ChildID同时出现在ChildList和RemainingChildList中。感谢任何能帮助我的人 <FosterHome

我正在使用java中的SAX解析器。我不确定:

1) 这种情况下我需要什么课程?我猜我想要 课程(如果我的想法完全错误,请告诉我): -寄养家庭(包含家庭和子女的阵列列表) -族(包含子级的ArrayList和父级的字符串) -子项(包含ChildID的ArrayList)

2) 如何在startElement和endElement方法中处理这种情况

复杂的是由于ChildID同时出现在ChildList和RemainingChildList中。感谢任何能帮助我的人

<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元素,可以在分别为ChildListRemainingChildList输入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时保存当前状态