当前位置: 首页 > 知识库问答 >
问题:

SAX解析:如何获取子节点

荣俊
2023-03-14
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
        <title>Game Analysis</title>
        <item>
            <title>GTA</title>
            <description>ABC</description>
            <pubDate>Sat, 21 Feb 2012 05:18:23 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3" length="6670315"/>
        </item>
        <item>
            <title>CoD</title>
            <description>XYZ</description>
            <pubDate>Sat, 21 Feb 2011 05:18:23 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3" length="6670315"/>
        </item>
    </channel>
</rss>

我可以使用以下方法获取第一个</code:public void startElement(String uri,String localName,String qName,Attributes Attributes)throws SAXException{if(qName.equals(“title”))...}</p

但是,我应该如何获取 block 中的标记呢?


共有1个答案

王泓
2023-03-14

下面是我如何使用SAX实现这一点的。

我修改了你的XML文件。

XML文件

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
        <title>Game Analysis</title>
        <item>
            <title>GTA</title>
            <description>ABC</description>
            <pubDate>Sat, 21 Feb 2012 05:18:23 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3/1" length="6670315"/>
        </item>
        <item>
            <title>CoD</title>
            <description>XYZ</description>
            <pubDate>Sat, 21 Feb 2011 05:45:10 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3/2" length="6670345"/>
        </item>
        <item>
            <title>AtV</title>
            <description>fgh</description>
            <pubDate>Sat, 21 Feb 2011 06:20:10 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3/3" length="6670364"/>
        </item>
    </channel>
    <channel>
        <title>Game Analysis 2</title>
        <item>
            <title>GTA 2</title>
            <description>ABC 2</description>
            <pubDate>Sat, 21 Feb 2012 04:18:23 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3/2/1" length="6670315"/>
        </item>
        <item>
            <title>CoD 2</title>
            <description>XYZ 2</description>
            <pubDate>Sat, 21 Feb 2011 04:45:10 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3/2/2" length="6670345"/>
        </item>
        <item>
            <title>AtV 2</title>
            <description>fgh</description>
            <pubDate>Sat, 21 Feb 2011 05:20:10 GMT</pubDate>
            <enclosure type="audio/mpeg" url="http://URL.mp3/2/3" length="6670364"/>
        </item>
    </channel>
</rss>
public class Channel {

    private String title;
    private ArrayList<Item> alItems;

    public Channel(){}

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public ArrayList<Item> getAlItems() {
        return alItems;
    }

    public void setAlItems(ArrayList<Item> alItems) {
        this.alItems = alItems;
    }


}
public class Enclosure {

    private String type;
    private URL url;
    private Integer length;


    public Enclosure(){}

    public String getType() {
        return type;
    }


    public void setType(String type) {
        this.type = type;
    }


    public URL getUrl() {
        return url;
    }


    public void setUrl(URL url) {
        this.url = url;
    }


    public Integer getLength() {
        return length;
    }


    public void setLength(Integer length) {
        this.length = length;
    }




}
public class Item {

    private String title;
    private String description;
    private String pubDate;
    private Enclosure enclosure;

    public Item(){}

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getPubDate() {
        return pubDate;
    }

    public void setPubDate(String pubDate) {
        this.pubDate = pubDate;
    }

    public Enclosure getEnclosure() {
        return enclosure;
    }

    public void setEnclosure(Enclosure enclosure) {
        this.enclosure = enclosure;
    }



}

通道处理程序

public class ChannelHandler extends DefaultHandler{

    private ArrayList<Channel> alChannels;
    private Channel channel;
    private String reading;
    private ArrayList<Item> alItems;
    private Item item;
    private Enclosure enclosure;

    public ChannelHandler(){
        super();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        if(qName.equals("rss")){
                alChannels = new ArrayList<>();
        }
        else if(qName.equals("channel")){
            channel = new Channel();
        }
        else if(qName.equals("item")){
            item = new Item();
        }
        else if(qName.equals("enclosure")){

            enclosure = new Enclosure();
            enclosure.setType(attributes.getValue("type"));
            try {
                enclosure.setUrl(new URL(attributes.getValue("url")));
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            enclosure.setLength(Integer.parseInt(attributes.getValue("length")));

        }

    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if(qName.equals("channel")){
            channel.setAlItems(alItems);
            alChannels.add(channel);
            alItems = null;
        }
        if(qName.equals("title")){

            if(alItems == null){
                channel.setTitle(reading);
                alItems = new ArrayList<>();
            }
            else if(item != null) {
                item.setTitle(reading);
            }

        }
        else if(qName.equals("item")){

            if(alItems != null){
                alItems.add(item);
                item = null;
            }

        }
        else if(qName.equals("description")){
            item.setDescription(reading);
        }
        else if(qName.equals("pubDate")){
            item.setPubDate(reading);
        }
        else if(qName.equals("enclosure")){
            item.setEnclosure(enclosure);
        }

    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        reading = new String(ch, start, length);
    }

    public ArrayList<Channel> getAlChannels() {
        return alChannels;
    }


}

经理

XMLManager

public final class XMLManager {


    public static ArrayList<Channel> getAlChannels(){
        ArrayList<Channel> alChannels = null;
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            File file = new File("D:\\Loic_Workspace\\TestSAX2\\res\\test.xml");
            ChannelHandler channelHandler = new ChannelHandler();
            parser.parse(file, channelHandler);
            alChannels = channelHandler.getAlChannels();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return alChannels;
    }

}
public class MyMain {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Enclosure enclosure = null;
        for(Channel channel : XMLManager.getAlChannels()){
            System.out.println("Channel title : "+channel.getTitle());
            System.out.println("------------------------");
            for(Item i:channel.getAlItems()){
                System.out.println(i.getTitle());
                System.out.println(i.getPubDate());
                System.out.println("Enclosure : ");
                enclosure = i.getEnclosure();
                System.out.println(enclosure.getType());
                System.out.println(enclosure.getUrl());
                System.out.println(enclosure.getLength());
                System.out.println("------------------------");
            }
        }




    }

}
Channel title : Game Analysis
------------------------
GTA
Sat, 21 Feb 2012 05:18:23 GMT
Enclosure : 
audio/mpeg
http://URL.mp3/1
6670315
------------------------
CoD
Sat, 21 Feb 2011 05:45:10 GMT
Enclosure : 
audio/mpeg
http://URL.mp3/2
6670345
------------------------
AtV
Sat, 21 Feb 2011 06:20:10 GMT
Enclosure : 
audio/mpeg
http://URL.mp3/3
6670364
------------------------
Channel title : Game Analysis 2
------------------------
GTA 2
Sat, 21 Feb 2012 04:18:23 GMT
Enclosure : 
audio/mpeg
http://URL.mp3/2/1
6670315
------------------------
CoD 2
Sat, 21 Feb 2011 04:45:10 GMT
Enclosure : 
audio/mpeg
http://URL.mp3/2/2
6670345
------------------------
AtV 2
Sat, 21 Feb 2011 05:20:10 GMT
Enclosure : 
audio/mpeg
http://URL.mp3/2/3
6670364
------------------------
 类似资料:
  • 问题内容: 给出了这个XML代码段 在SAX中,很容易获得属性值: 但是要获得文本节点的值,例如标签的值,这是很难的… 我不确定以上示例是否有效,您如何看待这种方法? 有没有更好的办法?(获取文本节点的值) 问题答案: 这是使用SAX的通常方法。 只是要注意每个标签可能被调用多次。这是一个完整的例子。 否则,您可以尝试使用StAX。

  • 首先,我认为这个错误是因为一个确切的文件。但是错误发生在不同的文件在不同的时间。如何使SAX解析器停止连接到Internet?

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须

  • 问题内容: 我正在用SAX解析XML文件,有时需要元素的内部XML。例如,对于以下XML 我需要获取元素 a 的内部XML ,这将是 最简单的方法是什么? 谢谢。 伊万 问题答案: 对于这种情况,我建议使用2个内容处理程序。第一个负责查找文档的相关部分,第二个负责处理内容。我对类似问题的答案(请参见下面的链接)演示了如何实现此方法: 使用SAX解析常见的XML元素

  • 问题内容: 我需要解析一个XML流。由于我只需要做一次就可以构建我的java对象,因此SAX看起来很自然。我正在扩展DefaultHandler并实现startElement,endElement和character方法,在我的类中具有保存当前读取值(在characters方法中使用)的成员。 我可以轻松完成所需的工作,但是我的代码变得相当复杂,并且我确信没有理由这样做,并且我可以做不同的事情。我