0

从互联网解析 xml 时出现问题。解析器没有正确返回所有数据。

三是三误:

正确结果 --> 返回结果

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

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

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

我试图解析的 xml 文件的副本

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;
    }
  }
}

你能就这里的问题提供一些建议吗?

4

1 回答 1

0

根据 SAX 定义characters()方法,每个元素可以调用多次。所以它应该积累文本;如果发生这种情况,那么您的代码将无法正常工作。

于 2012-05-26T14:12:34.920 回答