2010-04-28 2 views

답변

19

응용 프로그램에서 XML을 읽으려면 "xml"(소문자)이라는 프로젝트 내의 res 폴더에 폴더를 만듭니다. 이 새로 만든 폴더에 XML을 저장하십시오. , 자원에서 XML을로드하려면

XmlResourceParser myxml = mContext.getResources().getXml(R.xml.MyXml);//MyXml.xml is name of our xml in newly created xml folder, mContext is the current context 
// Alternatively use: XmlResourceParser myxml = getContext().getResources().getXml(R.xml.MyXml); 

myxml.next();//Get next parse event 
int eventType = myxml.getEventType(); //Get current xml event i.e., START_DOCUMENT etc. 
그런 다음 노드를 처리하기 위해 시작할 수 있습니다

는, 속성 등 텍스트 이벤트 유형, 한 번에 처리 통화 myxml.next을 (케이싱에 의해 포함) 다음 이벤트를 얻기 위해, 즉, ,

String NodeValue; 
    while (eventType != XmlPullParser.END_DOCUMENT) //Keep going until end of xml document 
    { 
     if(eventType == XmlPullParser.START_DOCUMENT) 
     {  
      //Start of XML, can check this with myxml.getName() in Log, see if your xml has read successfully 
     }  
     else if(eventType == XmlPullParser.START_TAG) 
     {  
      NodeValue = myxml.getName();//Start of a Node 
      if (NodeValue.equalsIgnoreCase("FirstNodeNameType")) 
      { 
        // use myxml.getAttributeValue(x); where x is the number 
        // of the attribute whose data you want to use for this node 

      } 

      if (NodeValue.equalsIgnoreCase("SecondNodeNameType")) 
      { 
        // use myxml.getAttributeValue(x); where x is the number 
        // of the attribute whose data you want to use for this node 

      } 
      //etc for each node name 
     } 
     else if(eventType == XmlPullParser.END_TAG) 
     {  
      //End of document 
     }  
     else if(eventType == XmlPullParser.TEXT) 
     {  
      //Any XML text 
     } 

     eventType = myxml.next(); //Get next event from xml parser 
    } 
6
 
package com.xml; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
import android.util.Log; 
import android.widget.Toast; 

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(""); 
       Log.i("sb ", sb+""); 

      } 
      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) 
     { 
//   System.out.println("start " +start+"length "+length); 
      String theString = new String(ch, start, length); 

      this.sb.append(theString+"start "+start+" length "+length); 
     } 
    } 

} 
 
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());
1

샘플 코드

  1. 문서 만들기 BuilderFactory

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    1. 는 DocumentBuilder를

    DocumentBuilder를 빌더 = 공장을 만듭니다. newDocumentBuilder();

    1. 입력 스트림 클래스 로더 CLS 얻을 DomReader.class.getClassLoader =(); InputStream is = cls.getResourceAsStream ("xml file");
      1. parse xml 파일을 가져 와서 DocumentBuilder 개체의 구문 분석 메서드 을 호출하여 Document 개체를 가져옵니다. 문서 document = builder.parse (is);
      2. 문서 객체를 사용한 트래버스 dom 트리. SAX : 간단한 xml 구문 분석. 노드별로 노드를 구문 분석합니다. 위쪽에서 아래쪽으로 이동합니다. 메모리 사용량이 적습니다. 색소폰으로는 이전 탐색이 불가능합니다. ; 필요한 핸들러에게 공용 클래스 SaxParse를 구현

    //는 SAXParserFactory와의 의 SAXParserFactory 공장 = SAXParserFactory.newInstance()의 DefaultHandler { } // 새로운 인스턴스를 확장 // SAX PARSER의 새로운 인스턴스 SAXParser saxparser = factory.newSAXParser(); // XML 문서 구문 분석 SAXParser.parse (새 파일 (구문 분석 할 파일), 새 SAXXMLParserImpl());