/** * Create a {@link XMLEventReader} from the given list of {@link XMLEvent}. * @param events the list of {@link XMLEvent XMLEvents}. * @return an {@code XMLEventReader} that reads from the given events * @since 5.0 */ public static XMLEventReader createXMLEventReader(List<XMLEvent> events) { return new ListBasedXMLEventReader(events); }
@Override public String getElementText() throws XMLStreamException { checkIfClosed(); if (this.currentEvent == null || !this.currentEvent.isStartElement()) { throw new XMLStreamException("Not at START_ELEMENT: " + this.currentEvent); } StringBuilder builder = new StringBuilder(); while (true) { XMLEvent event = nextEvent(); if (event.isEndElement()) { break; } else if (!event.isCharacters()) { throw new XMLStreamException("Unexpected non-text event: " + event); } Characters characters = event.asCharacters(); if (!characters.isIgnorableWhiteSpace()) { builder.append(event.asCharacters().getData()); } } return builder.toString(); }
@Override @Nullable public XMLEvent peek() { if (hasNext()) { return this.events.get(this.cursor); } else { return null; } }
@Test public void testGetElementText() throws Exception { String xml = "<foo><bar>baz</bar></foo>"; List<XMLEvent> events = readEvents(xml); ListBasedXMLEventReader reader = new ListBasedXMLEventReader(events); assertEquals(START_DOCUMENT, reader.nextEvent().getEventType()); assertEquals(START_ELEMENT, reader.nextEvent().getEventType()); assertEquals(START_ELEMENT, reader.nextEvent().getEventType()); assertEquals("baz", reader.getElementText()); assertEquals(END_ELEMENT, reader.nextEvent().getEventType()); assertEquals(END_DOCUMENT, reader.nextEvent().getEventType()); }
@Test public void testGetElementTextThrowsExceptionAtWrongPosition() throws Exception { String xml = "<foo><bar>baz</bar></foo>"; List<XMLEvent> events = readEvents(xml); ListBasedXMLEventReader reader = new ListBasedXMLEventReader(events); assertEquals(START_DOCUMENT, reader.nextEvent().getEventType()); try { reader.getElementText(); fail("Should have thrown XMLStreamException"); } catch (XMLStreamException ex) { // expected assertTrue(ex.getMessage().startsWith("Not at START_ELEMENT")); } }
@Override @Nullable public XMLEvent nextTag() throws XMLStreamException { checkIfClosed(); while (true) { XMLEvent event = nextEvent(); switch (event.getEventType()) { case XMLStreamConstants.START_ELEMENT: case XMLStreamConstants.END_ELEMENT: return event; case XMLStreamConstants.END_DOCUMENT: return null; case XMLStreamConstants.SPACE: case XMLStreamConstants.COMMENT: case XMLStreamConstants.PROCESSING_INSTRUCTION: continue; case XMLStreamConstants.CDATA: case XMLStreamConstants.CHARACTERS: if (!event.asCharacters().isWhiteSpace()) { throw new XMLStreamException( "Non-ignorable whitespace CDATA or CHARACTERS event: " + event); } break; default: throw new XMLStreamException("Expected START_ELEMENT or END_ELEMENT: " + event); } } }
@Override public XMLEvent nextEvent() { if (hasNext()) { this.currentEvent = this.events.get(this.cursor); this.cursor++; return this.currentEvent; } else { throw new NoSuchElementException(); } }
/** * Create a {@link XMLEventReader} from the given list of {@link XMLEvent}. * @param events the list of {@link XMLEvent XMLEvents}. * @return an {@code XMLEventReader} that reads from the given events * @since 5.0 */ public static XMLEventReader createXMLEventReader(List<XMLEvent> events) { return new ListBasedXMLEventReader(events); }
@Override public String getElementText() throws XMLStreamException { checkIfClosed(); if (this.currentEvent == null || !this.currentEvent.isStartElement()) { throw new XMLStreamException("Not at START_ELEMENT: " + this.currentEvent); } StringBuilder builder = new StringBuilder(); while (true) { XMLEvent event = nextEvent(); if (event.isEndElement()) { break; } else if (!event.isCharacters()) { throw new XMLStreamException("Unexpected non-text event: " + event); } Characters characters = event.asCharacters(); if (!characters.isIgnorableWhiteSpace()) { builder.append(event.asCharacters().getData()); } } return builder.toString(); }
@Override public XMLEvent nextEvent() { if (hasNext()) { this.currentEvent = this.events.get(this.cursor); this.cursor++; return this.currentEvent; } else { throw new NoSuchElementException(); } }
@Test public void standard() throws Exception { String xml = "<foo><bar>baz</bar></foo>"; List<XMLEvent> events = readEvents(xml); ListBasedXMLEventReader reader = new ListBasedXMLEventReader(events); StringWriter resultWriter = new StringWriter(); XMLEventWriter writer = this.outputFactory.createXMLEventWriter(resultWriter); writer.add(reader); assertThat(resultWriter.toString(), isSimilarTo(xml)); }
@Override @Nullable public XMLEvent nextTag() throws XMLStreamException { checkIfClosed(); while (true) { XMLEvent event = nextEvent(); switch (event.getEventType()) { case XMLStreamConstants.START_ELEMENT: case XMLStreamConstants.END_ELEMENT: return event; case XMLStreamConstants.END_DOCUMENT: return null; case XMLStreamConstants.SPACE: case XMLStreamConstants.COMMENT: case XMLStreamConstants.PROCESSING_INSTRUCTION: continue; case XMLStreamConstants.CDATA: case XMLStreamConstants.CHARACTERS: if (!event.asCharacters().isWhiteSpace()) { throw new XMLStreamException( "Non-ignorable whitespace CDATA or CHARACTERS event: " + event); } break; default: throw new XMLStreamException("Expected START_ELEMENT or END_ELEMENT: " + event); } } }
@Override @Nullable public XMLEvent peek() { if (hasNext()) { return this.events.get(this.cursor); } else { return null; } }
/** * Create a {@link XMLEventReader} from the given list of {@link XMLEvent}. * @param events the list of {@link XMLEvent XMLEvents}. * @return an {@code XMLEventReader} that reads from the given events * @since 5.0 */ public static XMLEventReader createXMLEventReader(List<XMLEvent> events) { return new ListBasedXMLEventReader(events); }
@Override public String getElementText() throws XMLStreamException { checkIfClosed(); if (this.currentEvent == null || !this.currentEvent.isStartElement()) { throw new XMLStreamException("Not at START_ELEMENT: " + this.currentEvent); } StringBuilder builder = new StringBuilder(); while (true) { XMLEvent event = nextEvent(); if (event.isEndElement()) { break; } else if (!event.isCharacters()) { throw new XMLStreamException("Unexpected non-text event: " + event); } Characters characters = event.asCharacters(); if (!characters.isIgnorableWhiteSpace()) { builder.append(event.asCharacters().getData()); } } return builder.toString(); }
@Override public XMLEvent nextEvent() { if (hasNext()) { this.currentEvent = this.events.get(this.cursor); this.cursor++; return this.currentEvent; } else { throw new NoSuchElementException(); } }
@Override public String getElementText() throws XMLStreamException { checkIfClosed(); if (this.currentEvent == null || !this.currentEvent.isStartElement()) { throw new XMLStreamException("Not at START_ELEMENT: " + this.currentEvent); } StringBuilder builder = new StringBuilder(); while (true) { XMLEvent event = nextEvent(); if (event.isEndElement()) { break; } else if (!event.isCharacters()) { throw new XMLStreamException("Unexpected non-text event: " + event); } Characters characters = event.asCharacters(); if (!characters.isIgnorableWhiteSpace()) { builder.append(event.asCharacters().getData()); } } return builder.toString(); }
@Override public XMLEvent nextEvent() { if (hasNext()) { this.currentEvent = this.events.get(this.cursor); this.cursor++; return this.currentEvent; } else { throw new NoSuchElementException(); } }
@Override @Nullable public XMLEvent nextTag() throws XMLStreamException { checkIfClosed(); while (true) { XMLEvent event = nextEvent(); switch (event.getEventType()) { case XMLStreamConstants.START_ELEMENT: case XMLStreamConstants.END_ELEMENT: return event; case XMLStreamConstants.END_DOCUMENT: return null; case XMLStreamConstants.SPACE: case XMLStreamConstants.COMMENT: case XMLStreamConstants.PROCESSING_INSTRUCTION: continue; case XMLStreamConstants.CDATA: case XMLStreamConstants.CHARACTERS: if (!event.asCharacters().isWhiteSpace()) { throw new XMLStreamException( "Non-ignorable whitespace CDATA or CHARACTERS event: " + event); } break; default: throw new XMLStreamException("Expected START_ELEMENT or END_ELEMENT: " + event); } } }
@Override @Nullable public XMLEvent peek() { if (hasNext()) { return this.events.get(this.cursor); } else { return null; } }