Разбор XML с помощью SAX в Java - PullRequest
       6

Разбор XML с помощью SAX в Java

0 голосов
/ 24 октября 2011

У меня есть этот код для анализа XML-данных ..

Но когда вызываются функции startelement и endelement, они не получают значений параметров (поскольку у параметра name нет данных) при привязке к печати значений параметров. это не имеет никакого значения, почему?

Я вызываю функцию updateArticle в следующем коде

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

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;


    public class RSSHandler extends DefaultHandler {

            // Used to define what elements we are currently in
            private boolean inItem = false;
            private boolean inTitle = false;
            private boolean inLink = false;

            // Feed and Article objects to use for temporary storage
            private Article currentArticle = new Article();
            private Feed currentFeed = new Feed();

            // Number of articles added so far
            private int articlesAdded = 0;

            private ArrayList<Article> articles = new ArrayList<Article>(); 
            private ArrayList<Feed> feeds = new ArrayList<Feed>(); 
            // Number of articles to download
            private static final int ARTICLES_LIMIT = 15;

            // The possible values for targetFlag
            private static final int TARGET_FEED = 0;
            private static final int TARGET_ARTICLES = 1;

            // A flag to know if looking for Articles or Feed name
            private int targetFlag;


            public RSSHandler(){ }
            public void startElement(String uri, String name, String qName,Attributes atts) {
                    if (name.trim().equals("title"))
                            inTitle = true;
                    else if (name.trim().equals("item"))
                            inItem = true;
                    else if (name.trim().equals("link"))
                            inLink = true;
                    System.out.println(name.trim());
            }

            public void endElement(String uri, String name, String qName)throws SAXException {
                    if (name.trim().equals("title"))
                            inTitle = false;
                    else if (name.trim().equals("item"))
                            inItem = false;
                    else if (name.trim().equals("link"))
                            inLink = false;

                    // Check if looking for feed, and if feed is complete
                    if (targetFlag == TARGET_FEED && currentFeed.url != null && currentFeed.title != null) {
                            // We know everything we need to know, so insert feed and exit
                            System.out.println("add current feed");
                            feeds.add(currentFeed);
                         //   throw new SAXException();
                    }

                    // Check if looking for article, and if article is complete
                    if (targetFlag == TARGET_ARTICLES && currentArticle.url != null && currentArticle.title != null) {

                            Article article = new Article();
                            article.feedId = currentFeed.id;
                            article.title = currentArticle.title;
                            article.url = currentArticle.url;
                            System.out.print(article.title);
                            articles.add(article);

                            //store articles in database

                            currentArticle.title = null;
                            currentArticle.url = null;

                            // Lets check if we've hit our limit on number of articles
                            articlesAdded++;
                            if (articlesAdded >= ARTICLES_LIMIT)
                                    throw new SAXException();
                    }

            }
            public ArrayList<Article> getArticles(){
                return this.articles;
            }            
            public ArrayList<Feed> getFeeds(){
                return this.feeds;
            }
            public void characters(char ch[], int start, int length) {

                    String chars = (new String(ch).substring(start, start + length));
                    System.out.println(chars);
                    try {
                            // If not in item, then title/link refers to feed
                            if (!inItem) {
                                    if (inTitle)
                                            currentFeed.title = chars;

                            } else {

                                    if (inLink)
                                            currentArticle.url = new URL(chars);
                                    if (inTitle)
                                            currentArticle.title = chars;

                            }
                    } catch (MalformedURLException e) {
                    }

            }

            public void createFeed(URL url) {
                    try {
                            targetFlag = TARGET_FEED;
                            currentFeed.url = url;

                            SAXParserFactory spf = SAXParserFactory.newInstance();
                            SAXParser sp = spf.newSAXParser();
                            XMLReader xr = sp.getXMLReader();
                            xr.setContentHandler(this);
                            xr.parse(new InputSource(url.openStream()));

                    } catch (IOException e) {}
                    catch (SAXException e) {} 
                    catch (ParserConfigurationException e) {}
            }

            public void updateArticles(Feed feed) {
                    try {
                            targetFlag = TARGET_ARTICLES;
                            currentFeed = feed;
                            System.out.println(feed.url.toString());
                            SAXParserFactory spf = SAXParserFactory.newInstance();
                            SAXParser sp = spf.newSAXParser();
                            XMLReader xr = sp.getXMLReader();
                            xr.setContentHandler(this);
                            xr.parse(new InputSource(currentFeed.url.openStream()));

                    } catch (IOException e) {} 
                    catch (SAXException e) {} 
                    catch (ParserConfigurationException e) {}
            }

    }

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Одним из самых ужасных дизайнерских решений в JAXP (и их было много) было то, что SAXParserFactory по умолчанию создает анализатор, который не учитывает пространство имен.Всегда вызывайте setNamespaceAware (true) возвращаемого парсера.В противном случае XMLReader вызовет startElement, используя параметры, определенные для синтаксического анализатора, не поддерживающего пространство имен, что означает, что он будет предоставлять лексическое QName, но не local-name и URI.

0 голосов
/ 24 октября 2011

Параметр qName содержит имя элемента.

Вот пример , хотя его трудно прочитать из-за форматирования.

Пространство имен и т. Д. Имеет значение вгде / как добраться до имен элементов.

...