【问题标题】:How Do I Parse this XML in Java SAX?如何在 Java SAX 中解析这个 XML?
【发布时间】:2011-11-18 01:08:35
【问题描述】:

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

1) 这种情况需要哪些课程?我想我想拥有 课程(如果我的想法完全错误,请告诉我): -FosterHome(包含家庭和孩子的数组列表) -Family(包含 Child 的 ArrayList 和 parent 的 String) -Child(包含 ChildID 的 ArrayList)

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>

【问题讨论】:

  • 您选择使用 SAX 解析某些内容的方式取决于您要实现的目标。这个问题没有足够的细节来真正提供任何帮助。
  • 我想拥有一个 FosterHome 类,我可以在其中访问存储在下面的 Child 的所有信息。感谢您指出这一点,家庭标签现已关闭。

标签: java xml


【解决方案1】:

如果您的文档很小,我首先要说的是:不要使用 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!干净多了
【解决方案2】:

要处理来自不同父元素的ChildID元素,可以在进入startElement()处理方法时保存当前状态为 ChildListRemainingChildList 分别。然后,当您为 ChildID 输入 endElement() 处理程序方法时,您将根据保存状态(例如在 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());
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多