2009-12-04 3 views
1

그래서 중첩 된 태그 정의xmlpullparser를 사용하여 HTML과 유사한 문서를 파싱 하시겠습니까?

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

같은 태그를 중첩 포함 추한 파일을 구문 분석 할 수있어 내가 그들에 대해 걱정하지 않는다.

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

질문 : 그러나 그들은 XmlPullParser 실패 할 기회가 나는 모든 불필요한 태그를 제거 파일을 전처리 또는 제 3 자 라이브러리를 사용하여 w/o 벗어날 수 있을까?

편집 : 스 니펫을 실제로 의미가 업데이트되었습니다.

+0

뭔가를 확장 – eyelidlessness

+0

문제가 아니라고 확신하십니까

blah lah

blah? – CommonsWare

+0

당신은 [여기] (http://www.gyanportal.com/article/generic-xmlpullparser-for-android/25)와 같은 일반 구문 분석기가 필요합니다. – Samdrain

답변

1

그래서 XMLPullParser를 제거하고 SAXParser로 전환했습니다. 게다가, it performs better. 활동을

  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()); 
+0

내가 아는 한 대부분의 SAX-Parser는 Pull-Parser. Pull-Parser는 다른 노드보다 노드를 읽습니다. 한 번에 전체 String/Stream을 읽지 않으므로 사용 가능한 메모리가 거의없는 장치와 호환 될 수 있습니다. 난 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 클래스는 실패 매우 잘못. 그것은 절대적으로 잘 구성된 XML 스 니펫입니다. XmlPullParser 도구의 기능에 의문을 가질 수 있습니다.
관련 문제