2009-12-04 1 views
1

Так я должен разобрать уродливые файлы, которые содержат вложенные теги, какАнализ html-документа с помощью xmlpullparser?

<p>blah<strong>lah</strong>blah</p> 

Вложенные теги определены и не заботиться о них. Но они делают XmlPullParser неудачу:

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); 
parser.setInput(some_reader); 
while (parser.next() != XmlPullParser.END_DOCUMENT) { 
    if (XmlPullParser.START_TAG == event) { 
     String tag = parser.getName(); 
     if (tag != null) { 
      tag = tag.toLowerCase(); 
     } else { 
      continue; 
     } 
     if ("p".equals(tag)) { 
      String text = parser.nextText(); 
      // and here we go 
      // org.xmlpull.v1.XmlPullParserException: expected: /p read: strong 
     } 
    } 
} 

Вопроса: любой шанс, что я мог уйти без предварительной обработки файла вскрышного всех ненужных тегов или использовать сторонние библиотеки?

EDIT: Обновлен фрагмент, чтобы на самом деле иметь смысл.

+0

что-то очень неправильно с этим терпит неудачу. Это абсолютно хорошо сформированный фрагмент XML. Я буду подвергать сомнению возможности инструмента XmlPullParser. – eyelidlessness

+0

Уверены ли вы, что у вашей проблемы есть фрагмент

blah lah

blah? – CommonsWare

+0

Вам нужен общий парсер, как описано [здесь] (http://www.gyanportal.com/article/generic-xmlpullparser-for-android/25) – Samdrain

ответ

1

Итак, я избавился от XMLPullParser и переключился на SAXParser. Кроме того, it performs better.

+0

Насколько я знаю, большинство SAX-Parsers строятся поверх Pull-Parser. Pull-Parser читает узел, а другой - один. Он никогда не читает всю строку/поток сразу, что делает его совместимым для устройств с очень маленькой памятью. Я думаю, что XMLPullParser должен работать для вас, вам просто нужно правильно настроить его, чтобы иметь возможность анализировать html. –

1
package com.xml; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
import android.util.Log; 

public class FeedHandler extends DefaultHandler { 

    StringBuilder sb = null; 
    String ret = ""; 
    boolean bStore = false; 
    int howMany = 0; 

    FeedHandler() { } 

    String getResults() 
    { 
     return "XML parsed data.\nThere are [" + howMany + "] status updates\n\n" + ret; 
    } 
    @Override 
    public void startDocument() throws SAXException 
    { 
     // initialize "list" 
    } 

    @Override 
    public void endDocument() throws SAXException 
    { 

    } 

    @Override 
    public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 

     try { 
      if (localName.equals("status")) 
      { 
       this.sb = new StringBuilder(""); 
       bStore = true; 
      } 
      if (localName.equals("user")) 
      { 
       bStore = false; 
      } 
      if (localName.equals("text")) 
      { 
       this.sb = new StringBuilder(""); 
      } 
      if (localName.equals("created_at")) 
      { 
       this.sb = new StringBuilder(""); 
      } 
     } catch (Exception e) 
     { 

      Log.d("error in startElement", e.getStackTrace().toString()); 
     } 
    } 
    @Override 

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

     if (bStore) 
     { 
      if (localName.equals("created_at")) 
      { 
       ret += "Date: " + sb.toString() + "\n"; 
       sb = new StringBuilder(""); 
       return; 

      } 

      if (localName.equals("user")) 
      { 
       bStore = true; 
      } 

      if (localName.equals("text")) 
      { 

       ret += "Post: " + sb.toString() + "\n\n"; 
       sb = new StringBuilder(""); 
       return; 

      } 


     } 
     if (localName.equals("status")) 
     { 
      howMany++; 
      bStore = false; 
     } 
    } 
    @Override 

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

     if (bStore) 
     { 
      String theString = new String(ch, start, length); 

      this.sb.append(theString); 
     } 
    } 

} 

и это мой класс xmlActivity, что продлить активность

  InputSource is = new InputSource(getResources().openRawResource(R.raw.my)); 
      System.out.println("running xml file..... "); 
     // create the factory 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 

     // create a parser 
     SAXParser parser = factory.newSAXParser(); 

     // create the reader (scanner) 
     XMLReader xmlreader = parser.getXMLReader(); 

     // instantiate our handler 
     FeedHandler fh = new FeedHandler(); 

     // assign our handler 
     xmlreader.setContentHandler(fh); 

     // perform the synchronous parse 
     xmlreader.parse(is); 

     // should be done... let's display our results 
     tvData.setText(fh.getResults());