在java

时间:2015-11-17 05:32:20

标签: java xml parsing saxparser

我正在尝试解析rss xml,但仍在解析描述,因为我的程序在遇到时停止解析描述内容(')。

解析xml的代码:

public class RSSAX {

String channel_title="";

public void displayRSS()
{

    try {

        SAXParserFactory spf =  SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        sp.parse("http://www.ronkaplansbaseballbookshelf.com/feed/podcast/", new RSSHandler());


    } catch (Exception e) {
        // TODO: handle exception
        System.out.println("Messge is "+e.getMessage());
    }

}

private class RSSHandler extends DefaultHandler
{
    private boolean isItem = false;
    private String tagName=""; 

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        this.tagName= qName;
        if(qName.equals("item"))
        {
            this.isItem=true;
        }

    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
         this.tagName="";
         if(qName.equals("item"))
         {
             System.out.println("========================");
             this.isItem=false;
         }


    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {

        if(this.isItem)
        {
            //System.out.println("tagname is "+this.tagName);
            if(this.tagName.equals("title"))
            {
                System.out.println("title is "+(new String(ch,start,length)));
                this.tagName="";
            }
            else if(this.tagName.equals("link"))
            {
                System.out.println("link is "+(new String(ch,start,length)));
                this.tagName="";
            }
            else if(this.tagName.equals("description"))
            {
                String test=(new String(ch,start,length)).replaceAll("\\<.*?>","");
                test=StringEscapeUtils.escapeXml(StringEscapeUtils.unescapeXml(test));
                System.out.println("description is "+test);
                this.tagName="";
            }
            else if(this.tagName.equals("comments"))
            {
                System.out.println("comment link is "+(new String(ch,start,length)));
                this.tagName="";
            }
            else if(this.tagName.equals("pubDate"))
            {
                System.out.println("pubDate is "+(new String(ch,start,length)));
                this.tagName="";
            }
            else if(this.tagName.equals("category"))
            {
                System.out.println("Category is "+(new String(ch,start,length)));
                this.tagName="";
            }
            else if(this.tagName.equals("content:encoded"))
            {
                System.out.println("content:encoded is "+(new String(ch,start,length)));
                //this.tagName="";
            }

        }

    }

}



输出:

标题是The Bookshelf Conversation:Filip Bondy
链接是http://www.ronkaplansbaseballbookshelf.com/2015/08/04/the-bookshelf-conversation-filip-bondy/
pubDate是星期二,2015年8月4日14:31:45 +0000
评论链接为http://www.ronkaplansbaseballbookshelf.com/2015/08/04/the-bookshelf-conversation-filip-bondy/#comments
类别是2015年的标题 类别是作者简介/采访Ron Kaplan

描述是我的新泽西州的地主和经验丰富的体育记者菲利普邦迪在全国消遣史上最着名的游戏之一制作了一个有趣的卷。每当有

当它遇到那里的 ..

时,它会停止解析描述

2 个答案:

答案 0 :(得分:1)

SAX解析器可以按照自己喜欢的方式分解文本节点,并通过对characters()方法的多次调用来传递内容。重新组装这些作品是你的工作。

答案 1 :(得分:0)

您可以使用STAXParser来强制XMLStreamReader返回单个字符串,您可以包含:

factory.setProperty("javax.xml.stream.isCoalescing", true);

这有助于返回一个字符串,请参阅XMLStreamReade.next() Documentation