| 272 | /// |
| 273 | /// an Element object describing the parsed document (Basically its DOM) |
| 274 | public Element parse(Reader is) { |
| 275 | buffOffset = 0; |
| 276 | buffSize = -1; |
| 277 | eventParser = false; |
| 278 | Element rootElement = createNewElement("ROOT"); // ROOT is a "dummy" element that all other document elements are added to |
| 279 | try { |
| 280 | parseTagContent(rootElement, is); |
| 281 | } catch (IOException ioe) { |
| 282 | Log.e(ioe); |
| 283 | } |
| 284 | if (rootElement.getNumChildren() == 0) { |
| 285 | notifyError(ParserCallback.ERROR_NO_ROOTS, null, null, null, "XML document contains no root element."); |
| 286 | return null; |
| 287 | } else if (rootElement.getNumChildren() > 1) { |
| 288 | StringBuilder roots = new StringBuilder(); |
| 289 | for (int i = 1; i < rootElement.getNumChildren(); i++) { |
| 290 | Element elem = rootElement.getChildAt(i); |
| 291 | if (elem.isTextElement()) { |
| 292 | roots.append("Text (").append(elem.getText()).append("),"); |
| 293 | } else { |
| 294 | roots.append(elem.getTagName()).append(","); |
| 295 | } |
| 296 | } |
| 297 | if (roots.length() > 0 && roots.charAt(roots.length() - 1) == ',') { |
| 298 | roots.setLength(roots.length() - 1); |
| 299 | } |
| 300 | |
| 301 | Element firstRoot = rootElement.getChildAt(0); |
| 302 | String str = null; |
| 303 | if (firstRoot.isTextElement()) { |
| 304 | str = "TEXT:" + firstRoot.getText(); |
| 305 | } else { |
| 306 | str = firstRoot.getTagName(); |
| 307 | } |
| 308 | notifyError(ParserCallback.ERROR_MULTIPLE_ROOTS, null, null, null, "XML document contains multiple root elements, only the first root (" + str + ") will be used. Excessive roots: " + roots); |
| 309 | } |
| 310 | rootElement = rootElement.getChildAt(0); |
| 311 | return rootElement; |
| 312 | } |
| 313 | |
| 314 | /// Creates a new element. This should be overriden by parsers that use a subclass of Element. |
| 315 | /// |