SAX Parser: Как читать только из тега `Item`? - PullRequest
0 голосов
/ 22 мая 2018

Я использую SAX Parser для анализа содержимого XML.Пожалуйста, проверьте мой код ниже.

 public void parse(InputSource is, AppDataBean appDataBean) throws RuntimeException {

        int limitCheck;

        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            Log.d("SAX",appDataBean.getUrl());


            DefaultHandler handler = new DefaultHandler() {

                boolean title = false;
                boolean link = false;
                boolean author = false;

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

                    if (qName.equalsIgnoreCase(TITLE)) {
                        title = true;
                    }

                    if (qName.equalsIgnoreCase(LINK)) {
                        link = true;
                    }

                    if (qName.equalsIgnoreCase(AUTHOR)) {
                        author = true;
                    }


                    //Log.d("SAX","Start Element :" + qName);



                }

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




                }

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

                    System.out.println(new String(ch, start, length));


                    if (title) {
                        Log.d("SAX","End Element :" + "First Name : "
                                + new String(ch, start, length));

                        title = false;
                    }

                    if (link) {


                        Log.d("SAX","End Element :" + "Last Name : "
                                + new String(ch, start, length));
                        link = false;
                    }

                    if (author) {

                        Log.d("SAX","End Element :" + "Nick Name : "
                                + new String(ch, start, length));

                        author = false;
                    }

                }

            };

            saxParser.parse(is, handler);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Ниже приведен пример того, как будет выглядеть мой XML.

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
   <?xml-stylesheet type="text/xsl" href="rss.xsl"?>
   <channel>
      <title>MyRSS</title>
      <atom:link href="http://www.example.com/rss.php" rel="self" type="application/rss+xml" />
      <link>http://www.example.com/rss.php</link>
      <description>MyRSS</description>
      <language>en-us</language>
      <pubDate>Tue, 22 May 2018 13:15:15 +0530</pubDate>
      <item>
         <title>Title 1</title>
         <pubDate>Tue, 22 May 2018 13:14:40 +0530</pubDate>
         <link>http://www.example.com/news.php?nid=47610</link>
         <guid>http://www.example.com/news.php?nid=47610</guid>
         <description>bla bla bla</description>
      </item>
</channel>
</rss>

Однако здесь я не хочу избегать тега Channel и только читатькорневой тег Item.Только тогда я могу получить реальное содержание.Как я могу это сделать?

Обновление

Как подсказывает ответ, я попытался использовать SAX Parser с stack.Ниже приведен код, но все равно я ничего хорошего, теперь он ничего не печатает для First Name

public void parse(InputSource is,  AppDataBean appDataBean) throws RuntimeException {

        int limitCheck;
        stack = new Stack<>();


        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            Log.d("SAX", appDataBean.getUrl());


            DefaultHandler handler = new DefaultHandler() {

                boolean title = false;
                boolean link = false;
                boolean author = false;

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

                    Log.d("SAX", "localName: " + localName);

                    if(localName.equalsIgnoreCase("item"))
                    {
                        stack = new Stack<>();
                        stack.push(qName);
                    }


                    if (qName.equalsIgnoreCase(TITLE)) {
                        if(stack.peek().equalsIgnoreCase("item"))
                        {
                            title = true;
                        }

                    }

                    if (qName.equalsIgnoreCase(LINK)) {
                        link = true;
                    }

                    if (qName.equalsIgnoreCase(AUTHOR)) {
                        author = true;
                    }


                    //Log.d("SAX","Start Element :" + qName);


                }

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

                    stack.pop();
                }

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

                    System.out.println(new String(ch, start, length));


                    if (title) {
                        Log.d("SAX", "End Element :" + "First Name : "
                                + new String(ch, start, length));

                        title = false;
                    }

                    if (link) {


                        Log.d("SAX", "End Element :" + "Last Name : "
                                + new String(ch, start, length));
                        link = false;
                    }

                    if (author) {

                        Log.d("SAX", "End Element :" + "Nick Name : "
                                + new String(ch, start, length));

                        author = false;
                    }

                }

            };

            saxParser.parse(is, handler);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

1 Ответ

0 голосов
/ 22 мая 2018

Обычно приложение SAX поддерживает стек для хранения контекста.В случае события startElement поместите имя элемента в стек;на endElement выкинуть его из стека.Затем, когда вы получаете событие startElement для элемента заголовка, вы можете выполнить stack.peek (), чтобы увидеть, каков родитель заголовка.

...