【问题标题】:Parsing XML-response and store to a container解析 XML 响应并存储到容器
【发布时间】:2015-02-20 15:07:29
【问题描述】:

我正在对网站进行 HTTP 查询,我得到的响应是 XML 格式的。我想做的是进行多个查询,解析数据并将它们放在 ArrayList 或其他容器中,以便我可以轻松访问每个查询的数据。我一直在使用SAX 来解析响应。我阅读的示例具有如下 XML 格式:

<?xml version="1.0"?>
<company>
        <staff>
                <firstname>yong</firstname>
                <lastname>mook kim</lastname>
                <nickname>mkyong</nickname>
                <salary>100000</salary>
        </staff>
        <staff>
                <firstname>low</firstname>
                <lastname>yin fong</lastname>
                <nickname>fong fong</nickname>
                <salary>200000</salary>
        </staff>

仅通过查看 Internet 上的示例,我就可以很容易地解析这种格式。

但在我的情况下,我需要像这样解析数据:

<?xml version="1.0" encoding="UTF-8"?>
<root response="True">
<movie title="A Good Marriage" year="2014" rated="R" released="03 Oct 2014" runtime="102 min" genre="Thriller" director="Peter Askin" writer="Stephen King (short story)" actors="Joan Allen, Anthony LaPaglia, Stephen Lang, Cara Buono" plot="After 25 years of a good marriage, what will Darcy do once she discovers her husband's sinister secret?" language="English" country="USA" awards="N/A" poster="http://ia.media-imdb.com/images/M/MV5BMTk3MjY2ODgwNl5BMl5BanBnXkFtZTgwMTQ0Mjg0MjE@._V1_SX300.jpg" metascore="43" imdbRating="5.1" imdbVotes="2,016" imdbID="tt2180994" type="movie"/>
</root>

从这个响应中,我想将所有东西解析到某个容器中,所以它很容易使用。我还在学习东西,也许有人可以在这里帮助我,指出正确的方向? :) 查询不是问题,但解析和存储数据才是问题。

编辑:所以更清楚地说,我的问题是来自服务器的响应不像第一个示例那样采用整洁的 XML 格式,您可以看到它是这样的:

<movie title="A Good Marriage" year="2014" rated="R" released="03 Oct 2014" runtime="102 min" genre="Thriller" director="Peter Askin" writer="Stephen King (short story)" actors="Joan Allen, Anthony LaPaglia, Stephen Lang, Cara Buono" plot="After 25 years of a good marriage, what will Darcy do once she discovers her husband's sinister secret?" language="English" country="USA" awards="N/A" poster="http://ia.media-imdb.com/images/M/MV5BMTk3MjY2ODgwNl5BMl5BanBnXkFtZTgwMTQ0Mjg0MjE@._V1_SX300.jpg" metascore="43" imdbRating="5.1" imdbVotes="2,016" imdbID="tt2180994" type="movie"/>

当我运行我的代码时,它不会打印出任何东西,但是当我像这样手动修改 XML 时:

<?xml version="1.0" encoding="UTF-8"?>
<root response="True">
<movie> title="Oblivion" year="2013" rated="PG-13" released="19 Apr 2013" runtime="124 min" genre="Action, Adventure, Mystery" director="Joseph Kosinski" writer="Karl Gajdusek (screenplay), Michael Arndt (screenplay), Joseph Kosinski (graphic novel original story)" actors="Tom Cruise, Morgan Freeman, Olga Kurylenko, Andrea Riseborough" plot="A veteran assigned to extract Earth's remaining resources begins to question what he knows about his mission and himself." language="English" country="USA" awards="10 nominations." poster="http://ia.media-imdb.com/images/M/MV5BMTQwMDY0MTA4MF5BMl5BanBnXkFtZTcwNzI3MDgxOQ@@._V1_SX300.jpg" metascore="54" imdbRating="7.0" imdbVotes="307,845" imdbID="tt1483013" type="movie"/>
</movie>
</root>

所以我为电影元素添加了结束标签&gt;,并在最后添加了结束标签&lt;/movie&gt;,我的程序将其打印为:

Movie :  title="Oblivion" year="2013" rated="PG-13" released="19 Apr 2013" runtime="124 min" genre="Action, Adventure, Mystery" director="Joseph Kosinski" writer="Karl Gajdusek (screenplay), Michael Arndt (screenplay), Joseph Kosinski (graphic novel original story)" actors="Tom Cruise, Morgan Freeman, Olga Kurylenko, Andrea Riseborough" plot="A veteran assigned to extract Earth's remaining resources begins to question what he knows about his mission and himself." language="English" country="USA" awards="10 nominations." poster="http://ia.media-imdb.com/images/M/MV5BMTQwMDY0MTA4MF5BMl5BanBnXkFtZTcwNzI3MDgxOQ@@._V1_SX300.jpg" metascore="54" imdbRating="7.0" imdbVotes="307,845" imdbID="tt1483013" type="movie"/>

所以基本上我现在使用的代码读取&lt;movie&gt;&lt;/movie&gt;之间的所有内容,问题是来自服务器的原始响应使电影标签像这样打开:&lt;movie title="Oblivion"...并且没有&lt;/movie&gt;标记。

我一直在为此苦苦挣扎,希望有人能理解我令人困惑的解释!目前我的解析器代码如下所示:

public void getXml(){
    try {
        // obtain and configure a SAX based parser
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

        // obtain object for SAX parser
        SAXParser saxParser = saxParserFactory.newSAXParser();

        // default handler for SAX handler class
        // all three methods are written in handler's body
        DefaultHandler defaultHandler = new DefaultHandler(){

            String movieTag="close";

        // this method is called every time the parser gets an open tag '<'
        // identifies which tag is being open at time by assigning an open flag
        public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

                if(qName.equalsIgnoreCase("MOVIE")) {
                    movieTag = "open";
                }
            }

        // prints data stored in between '<' and '>' tags
        public void characters(char ch[], int start, int length)
            throws SAXException {

                if(movieTag.equals("open")) {
                    System.out.println("Movie : " + new String(ch, start, length));
                }
            }

        // calls by the parser whenever '>' end tag is found in xml 
        // makes tags flag to 'close'
        public void endElement(String uri, String localName, String qName)
            throws SAXException {

                if(qName.equalsIgnoreCase("MOVIE")) {
                    movieTag = "close";
                }
            }
            };

        // parse the XML specified in the given path and uses supplied
        // handler to parse the document
        // this calls startElement(), endElement() and character() methods
        // accordingly
        saxParser.parse("xml/testi.xml", defaultHandler);
        } catch (Exception e) {
            e.printStackTrace();
            }
    }

请任何人,非常感谢您的帮助..

【问题讨论】:

  • 仍在为此苦苦挣扎,不胜感激。 :)
  • 好的,使用 DOM-parser 解决了。

标签: java xml http parsing sax


【解决方案1】:

您仍然可以使用您一直在学习的 SAX 解析器。你没有提到你正在使用哪个解析器。我使用 xerxes(来自 Apache.org)。

您可能想要做的是实现一个扩展 DefaultHandler 的类。如果您使用 Eclipse 作为 IDE,您可以让 Eclipse 为 DefaultHandler 中的所有方法实现存根,然后将调试输出添加到每个方法,以便更好地了解发生的情况。

但重要的方法是这样的:

public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException

您的所有字段(标题、年份、评级等)都将在属性数组中可用。

那么你会得到什么:

- 调用 startElement - 为

调用 startElement

加上您不关心的其他电话。因此,一旦您了解自己在做什么,就可以根据需要删除仅是调试语句的方法。

【讨论】:

  • 感谢您的回答,抱歉响应缓慢,稍后尝试添加一些调试输出以获得更好的想法。我正在使用 NetBeans IDE,我正在使用 javax.xml.parsers.SAXParser 类。
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多