private <T extends Resource> AtomEntry<T> parseEntry(XmlPullParser xpp) throws Exception { AtomEntry<T> res = new AtomEntry<T>(); xpp.next(); int eventType = nextNoWhitespace(xpp); while (eventType != XmlPullParser.END_TAG) { if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("title")) { res.setTitle(parseString(xpp)); } else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("id")) res.setId(parseString(xpp)); else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("link")) { res.getLinks().put(xpp.getAttributeValue(null, "rel"), xpp.getAttributeValue(null, "href")); skipEmptyElement(xpp); } else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("updated")) res.setUpdated(parseDate(xpp)); else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("published")) res.setPublished(parseDate(xpp)); else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("category")) { if ("http://hl7.org/fhir/tag".equals(xpp.getAttributeValue(null, "scheme"))) res.getTags() .put(xpp.getAttributeValue(null, "term"), xpp.getAttributeValue(null, "label")); skipEmptyElement(xpp); } else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("author")) { xpp.next(); eventType = nextNoWhitespace(xpp); while (eventType != XmlPullParser.END_TAG) { if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("name")) { res.setAuthorName(parseString(xpp)); } else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("uri")) res.setAuthorUri(parseString(xpp)); else throw new Exception("Bad Xml parsing entry.author"); eventType = nextNoWhitespace(xpp); } xpp.next(); } else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("content")) { xpp.next(); nextNoWhitespace(xpp); XmlParser p = new XmlParser(); res.setResource( (T) p.parse( xpp)); // TODO Refactor architecture to eliminate this unsafe cast and better // support generics xpp.next(); nextNoWhitespace(xpp); if (xpp.getName().equals("content")) { xpp.next(); } } else if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("summary")) { xpp.next(); nextNoWhitespace(xpp); res.setSummary(new XhtmlParser().parseHtmlNode(xpp)); xpp.next(); nextNoWhitespace(xpp); if (xpp.getName().equals("summary")) { xpp.next(); } } else throw new Exception("Bad Xml parsing entry"); eventType = nextNoWhitespace(xpp); } xpp.next(); return res; }