2011-10-23 56 views
0

我有这样的代码来解析XML数据..解析XML全光照SAX在Java中

但当起始元素和endElement函数被调用,他们没有得到的参数值(如名称参数没有任何数据)当打结时打印参数值。它没有任何价值,为什么?

我打电话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) {} 
      } 

    } 

回答

0

qName参数包含的元素名称。

Here's an example虽然由于格式化而很难阅读。

命名空间等在使用/如何获取元素名称方面有所不同。

+0

@adham如果localName或qName都是空的,那么有可能是错误的。 –

1

JAXP中最令人震惊的设计决策之一(有很多)是SAXParserFactory默认创建了一个不支持命名空间的解析器。始终在返回的解析器上调用setNamespaceAware(true)。否则,XMLReader将使用为非名称空间感知解析器定义的选项调用startElement,这意味着它将提供词法QName,但不提供本地名称和URI。