使用SAXParser的错误解析XML [英] Error parsing xml using SAXParser

查看:262
本文介绍了使用SAXParser的错误解析XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从互联网解析XML时,我有一个问题。解析器不正确返回的所有数据。

I have a problem when parsing xml from the internet. The parser doesn't return all the data correctly.

三有三个错误:

正确的结果 - >返回结果

161:1:161 - > 1:1:161

161:1:161-->1:1:161

330:2:132 - > 3:2:132

330:2:132-->3:2:132

421:2:223 - >的4:2:223

421:2:223-->4:2:223

https://docs.google.com/open?id=0BwXEx9yI14inT1BnR2xzYnJEX0E

public class DataBaseUpdateService_1 extends Activity {
  private TextView TextView1 ;
  private LinearLayout linearlayout1 ;
  private TextView title[];
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.show_item);
    linearlayout1 = (LinearLayout)findViewById(R.id.linearlayout1);
    TextView1 = (TextView)findViewById(R.id.textView1);

    MyDBHelper dbHelper =new  MyDBHelper(DataBaseUpdateService_1.this);
    SQLiteDatabase db = dbHelper.getWritableDatabase();
      try {
      /** Handling XML */
      SAXParserFactory spf = SAXParserFactory.newInstance();
      SAXParser sp = spf.newSAXParser();
      XMLReader xr = sp.getXMLReader();

      /** Send URL to parse XML Tags */
      URL sourceUrl = new URL(
          "http://123.com/example.xml");

      /** Create handler to handle XML Tags ( extends DefaultHandler ) */
      DataBaseUpdate_XMLHandler XMLHandler = new DataBaseUpdate_XMLHandler();
      xr.setContentHandler(XMLHandler);
      xr.parse(new InputSource(sourceUrl.openStream()));

      }catch (Exception e) {
        System.out.println("XML Pasing Excpetion = " + e);
      }

      int itemCount =  DataBaseUpdate_XMLHandler.array.size();
      db.delete("hymns_match", null, null);

      try{  
        for(int i=0;i<itemCount;i++) {
          String songs_id=DataBaseUpdate_XMLHandler.array.get(i).get("songs_id");
          String songs_book_id=DataBaseUpdate_XMLHandler.array.get(i).get("songs_book_id");
          String songs_book_ch=DataBaseUpdate_XMLHandler.array.get(i).get("songs_book_ch");
          TextView tv = new TextView(DataBaseUpdateService_1.this);
          tv.setText(songs_id + ":"+songs_book_id+ ":"+songs_book_ch);
          linearlayout1.addView(tv);
        }
      }catch (Exception e) {
        System.out.println("XML Pasing Excpetion = " + e);
      }
  }
}

DataBaseUpdate_XMLHandler

public class DataBaseUpdate_XMLHandler extends DefaultHandler {
  Boolean currentElement = false;
  String currentValue=null;
  static ArrayList<LinkedHashMap<String, String>> array;
  LinkedHashMap map;

  @Override
  public void startDocument() throws SAXException {
    array = new ArrayList<LinkedHashMap<String, String>>();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    currentElement = true;
    if (localName.equals("song")) {
      map = new LinkedHashMap<String, Object>();
      currentValue=null;
    } 
    /*Get attribute
     * else if (localName.equals("website")) {
     * String attr = attributes.getValue("category");
     * sitesList.setCategory(attr);}
     * */
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    currentElement = false;

    /** set value */ 
    if (localName.equalsIgnoreCase("songs_id")){
      map.put("songs_id",currentValue);}
    else if (localName.equalsIgnoreCase("songs_book_id")){
      map.put("songs_book_id", currentValue);}
    else if (localName.equalsIgnoreCase("songs_book_ch")){
      map.put("songs_book_ch", currentValue);}
    else if (localName.equalsIgnoreCase("song")){
      array.add(map);}
  }

  /** Called to get tag characters
  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
    if (currentElement) {
      currentValue = new String(ch, start, length);
      currentElement = false;
    }
  }
}

你能给什么是错在这里一些建议吗?

Can you give some advice about what's wrong here?

推荐答案

根据该定义SAX 字符()方法可以每个元素被多次调用。所以应该积累的文本;如果发生这种情况那么你的code将无法工作。

According to the SAX definition characters() method can be called multiple times per elements. So it should accumulate the text; if this is happening then your code will not work.

这篇关于使用SAXParser的错误解析XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆