2015-10-15 4 views
0

Я создаю андроид приложение (с помощью Android Studio), которая использует данные в реальном времени по ссылке: http://transportapi.com/v3/uk/public/journey/from/Ladbroke%20Grove/to/Turnham%20Green.xml?api_key=a0d27caa983732936f45a891ebca6452&app_id=dc5f42ae&region=tflAndroid DOM разборе от URL

Информация в виде XML, то есть мне нужно, чтобы разобрать его в мой с использованием анализатора DOM. Однако ошибка, кажется, происходит, когда код попадает в данный момент:

Document doc = db.parse(new InputSource(url.openStream())); 

Моя программа не показывает никаких ошибок, когда я запускаю его, он просто выдает ошибку каждый раз, когда он достигнет этой точки на коде. Это приводит к тому, что «не чтение» распечатывается в textView (объявляется как tv1 в коде).

Я понимаю, что здесь есть много вопросов относительно разбора XML из URL-адреса на Android, однако ни одна из них, похоже, не помогает моей ситуации! Если у кого-то есть идеи, что я сделал неправильно, они были бы очень оценены.

try { 

     URL url = new URL("http://transportapi.com/v3/uk/public/journey/from/Ladbroke%20Grove/to/Turnham%20Green.xml?api_key=a0d27caa983732936f45a891ebca6452&app_id=dc5f42ae&region=tfl"); 


     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbFactory.newDocumentBuilder(); 

     Document doc = db.parse(new InputSource(url.openStream())); 
     doc.getDocumentElement().normalize(); 

    NodeList nList = doc.getElementsByTagName("route"); 

     for (int temp = 0; temp < nList.getLength(); temp++) { 
      Node nNode = nList.item(temp); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       tv1.setText(tv1.getText() + "Duration of route " + ": " + getValue("duration", eElement) + "\n"); 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     tv1.setText("not reading"); 
    } 



     private static String getValue(String sTag, Element eElement) { 
      NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 
       Node nValue = (Node) nlList.item(0); 
       return nValue.getNodeValue(); 
} 

}

+0

так, что делает 'e.printStackTrace();' печать? – wero

+0

ничего не печатает –

ответ

0

Вы можете попробовать следующее для XML-парсинга: https://code.google.com/p/android-source-browsing/source/browse/samples/training/network-usage/src/com/example/android/networkusage/StackOverflowXmlParser.java?repo=platform--development&r=99ca344b233f9419bf4cefc69997d54fc419b326

public class StackOverflowXmlParser { 
private static final String ns = null; 

// We don't use namespaces 

public List<Entry> parse(InputStream in) throws XmlPullParserException, IOException { 
    try { 
     XmlPullParser parser = Xml.newPullParser(); 
     parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
     parser.setInput(in, null); 
     parser.nextTag(); 
     return readFeed(parser); 
    } finally { 
     in.close(); 
    } 
} 

private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
    List<Entry> entries = new ArrayList<Entry>(); 

    parser.require(XmlPullParser.START_TAG, ns, "feed"); 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     // Starts by looking for the entry tag 
     if (name.equals("entry")) { 
      entries.add(readEntry(parser)); 
     } else { 
      skip(parser); 
     } 
    } 
    return entries; 
} 

// This class represents a single entry (post) in the XML feed. 
// It includes the data members "title," "link," and "summary." 
public static class Entry { 
    public final String title; 
    public final String link; 
    public final String summary; 

    private Entry(String title, String summary, String link) { 
     this.title = title; 
     this.summary = summary; 
     this.link = link; 
    } 
} 

// Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them 
// off 
// to their respective &quot;read&quot; methods for processing. Otherwise, skips the tag. 
private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "entry"); 
    String title = null; 
    String summary = null; 
    String link = null; 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     if (name.equals("title")) { 
      title = readTitle(parser); 
     } else if (name.equals("summary")) { 
      summary = readSummary(parser); 
     } else if (name.equals("link")) { 
      link = readLink(parser); 
     } else { 
      skip(parser); 
     } 
    } 
    return new Entry(title, summary, link); 
} 

// Processes title tags in the feed. 
private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "title"); 
    String title = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "title"); 
    return title; 
} 

// Processes link tags in the feed. 
private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException { 
    String link = ""; 
    parser.require(XmlPullParser.START_TAG, ns, "link"); 
    String tag = parser.getName(); 
    String relType = parser.getAttributeValue(null, "rel"); 
    if (tag.equals("link")) { 
     if (relType.equals("alternate")) { 
      link = parser.getAttributeValue(null, "href"); 
      parser.nextTag(); 
     } 
    } 
    parser.require(XmlPullParser.END_TAG, ns, "link"); 
    return link; 
} 

// Processes summary tags in the feed. 
private String readSummary(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "summary"); 
    String summary = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "summary"); 
    return summary; 
} 

// For the tags title and summary, extracts their text values. 
private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { 
    String result = ""; 
    if (parser.next() == XmlPullParser.TEXT) { 
     result = parser.getText(); 
     parser.nextTag(); 
    } 
    return result; 
} 

// Skips tags the parser isn't interested in. Uses depth to handle nested tags. i.e., 
// if the next tag after a START_TAG isn't a matching END_TAG, it keeps going until it 
// finds the matching END_TAG (as indicated by the value of "depth" being 0). 
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { 
    if (parser.getEventType() != XmlPullParser.START_TAG) { 
     throw new IllegalStateException(); 
    } 
    int depth = 1; 
    while (depth != 0) { 
     switch (parser.next()) { 
     case XmlPullParser.END_TAG: 
       depth--; 
       break; 
     case XmlPullParser.START_TAG: 
       depth++; 
       break; 
     } 
    } 
} 

}

Смежные вопросы