2012-06-03 67 views
0

我是在android中使用SAX解析器的新工作。問題是,我解析我的本地XML文件後,我想檢查它是否保留值與System.out.println,但它返回null。android中的SAX解析器不會返回值

所以,基本上如果我嘗試ArrayList<PlaceEntry> pl = PlacesXMLHandler.places;,然後檢查system.out.print(pl),它有一個空的數組。我試圖用PlaceEntry做同樣的事情,它也給我null。我猜測我創建XMLHandler時犯了一個錯誤,但我不確定它在哪裏。

我的XML:

<?xml version="1.0" encoding="utf-8"?> 

    <nodes> 
     <entry> 
      <title>My Title</title> 
      <description>Description</description> 
     <webpage>www.google.com</webpage> 
      <coordinates> 
       <latitude>100.00</latitude> 
       <longitude>100.00</longitude> 
      </coordinates> 
     </entry> 
    </nodes>  

我的擴展處理類:

public class PlacesXMLHandler extends DefaultHandler 
    { 
private Boolean currentElement = false; 
private String currentValue = null; 
public static PlaceEntry placeEntry = null; 
public static ArrayList<PlaceEntry> places = null; 
private String[] coord = null; 

public static PlaceEntry getPlaceEntry() 
{ 
    return placeEntry; 
} 

public static void setSitesList(PlaceEntry placeEntry) 
{ 
    PlacesXMLHandler.placeEntry = placeEntry; 
} 

@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException 
{ 
    currentElement = true; 

    if (localName.equals("nodes")) 
    { 
     places = new ArrayList<PlaceEntry>(); 
    } 
    else if (localName.equals("entry")) 
    { 
     placeEntry = new PlaceEntry(); 
     places.add(placeEntry); 
    } 
    else if (localName.equals("coordinates")) 
    { 
     coord = new String[2]; 
    } 
} 

@Override 
public void endElement(String uri, String localName, String qName) 
    throws SAXException 
{ 

    currentElement = false; 

    if (localName.equalsIgnoreCase("title")) 
     placeEntry.setTitle(currentValue); 
    else if (localName.equalsIgnoreCase("description")) 
     placeEntry.setSubtitle(currentValue); 
    else if (localName.equalsIgnoreCase("webpage")) 
     placeEntry.setWebpage(currentValue); 
    else if (localName.equalsIgnoreCase("latitude")) 
     coord[0] = currentValue; 
    else if (localName.equalsIgnoreCase("longitude")) 
     coord[1] = currentValue; 

    if (!coord.equals(null)) 
     placeEntry.setCoordinates(coord[0], coord[1]); 
} 

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

} 

我PlaceEntry類:

public class PlaceEntry implements Serializable 
{ 
public String title; 
public String subtitle; 
public String[] coord; 
public String webpage; 

public PlaceEntry() 
{ 
    setTitle(null); 
    setSubtitle(null); 
    setWebpage(null); 
    setCoordinates(null, null); 
} 

public void setTitle (String title) 
{ 
    this.title = title; 
} 

public String getTitle() 
{ 
    return title; 
} 

public void setSubtitle (String subtitle) 
{ 
    this.subtitle = subtitle; 
} 

public String getSubtitle() 
{ 
    return subtitle; 
} 

public void setWebpage (String webpage) 
{ 
    this.webpage = webpage; 
} 

public String getWebpage() 
{ 
    return webpage; 
} 

public void setCoordinates (String lat, String lng) 
{ 
    this.coord[0] = lat; 
    this.coord[1] = lng; 
} 

public String[] getCoordinates() 
{ 
    return coord; 
} 
} 

回答

0
用手

停止寫作解析器

對於初學者來說,Android的耗材「基礎知識」 - 還有可用的框架等。

這個簡短的例子展示瞭如何使用android.sax框架,而不是子類化DefaultHandler,並花費不必要的時間調試你的解析器。

class EntryParser { 
    public static class Entry { 
     public String mTitle; 
     public String mDescription; 
     public String mWebPage; 
     public String mLatitude; 
     public String mLongitude; 
    } 
    private List<Entry> mEntries = new ArrayList<EntryParser.Entry>(); 
    private Entry mEntry; 
    public List<Entry> parse(String xml) throws SAXException { 
     Xml.parse(xml, init()); 
     return Collections.unmodifiableList(mEntries); 
    } 
    public List<Entry> parse(InputStream xml) throws SAXException, IOException { 
     Xml.parse(xml, Encoding.UTF_8, init()); 
     return Collections.unmodifiableList(mEntries); 
    } 
    private ContentHandler init() { 
     mEntries.clear(); 
     RootElement nodes = new RootElement("nodes"); 
     Element entry = nodes.getChild("entry"); 
     entry.setElementListener(new ElementListener() { 
      public void start(Attributes attributes) { 
       mEntry = new Entry(); 
      } 
      public void end() { 
       // Validation goes here 
       mEntries.add(mEntry); 
      } 
     }); 
     Element title = entry.getChild("title"); 
     title.setEndTextElementListener(new EndTextElementListener() { 
      public void end(String body) { 
       mEntry.mTitle = body; 
      } 
     }); 
     Element description = entry.getChild("description"); 
     description.setEndTextElementListener(new EndTextElementListener() { 
      public void end(String body) { 
       mEntry.mDescription = body; 
      } 
     }); 
     Element webpage = entry.getChild("webpage"); 
     webpage.setEndTextElementListener(new EndTextElementListener() { 
      public void end(String body) { 
       mEntry.mWebPage = body; 
      } 
     }); 
     Element coordinates = entry.getChild("coordinates"); 
     Element latitude = coordinates.requireChild("latitude"); 
     latitude.setEndTextElementListener(new EndTextElementListener() { 
      public void end(String body) { 
       mEntry.mLatitude = body; 
      } 
     }); 
     Element longitude = coordinates.requireChild("longitude"); 
     longitude.setEndTextElementListener(new EndTextElementListener() { 
      public void end(String body) { 
       mEntry.mLongitude = body; 
      } 
     }); 
     return nodes.getContentHandler(); 
    } 
} 

調用是這樣的:

EntryParser ep = new EntryParser(); 
List<EntryParser.Entry> entries = ep.parse(..); // String or InputStream