public <T> T read(BufferedSource source, Type clazz) throws IOException { XmlReader reader = XmlReader.of(source); reader.beginElement(); reader.nextElementName(); // We don't care about the name of the root tag T value = (T)config.getTypeAdapter(clazz).fromXml(reader, config); reader.endElement(); return value; }
@Override public List<String> fromXml(XmlReader reader, TikXmlConfig config) throws IOException { List<String> list = new ArrayList<>(); while (reader.hasElement()) { // <a>a<a> // <b>b</b> // <c>c</c> reader.beginElement(); reader.nextElementName(); // Ignore element name String value = reader.nextTextContent(); list.add(value); reader.endElement(); } return list; }
@Override public Catalogue fromXml(XmlReader reader, TikXmlConfig config) throws IOException { Catalogue catalogue = new Catalogue(); catalogue.books = new ArrayList<>(); while (reader.hasElement()) { reader.beginElement(); if (reader.nextElementName().equals("book")) { catalogue.books.add((Book) config.getTypeAdapter(Book.class).fromXml(reader, config)); } reader.endElement(); } return catalogue; }
@Test public void elementNamedDOCTYPEisRegularElement() throws IOException { String xml = "<root><DOCTYPE /></root>"; XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertEquals("root", reader.nextElementName()); reader.beginElement(); Assert.assertEquals("DOCTYPE", reader.nextElementName()); reader.endElement(); reader.endElement(); Assert.assertFalse(reader.hasElement()); }
@Test public void skipAttribute() throws IOException { String xml = "<foo abc=\"123\" />"; XmlReader reader = readerFrom(xml); reader.beginElement(); reader.nextElementName(); reader.skipAttribute(); reader.endElement(); }
@Test public void doctypeAsChildIsNotAllowed() throws IOException { String xml = "<root><!DOCTYPE foo></root>"; try { XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertEquals("root", reader.nextElementName()); reader.beginElement(); Assert.fail("Excpetion expected"); } catch (IOException e) { // TODO Should doctype gets it's own error message? Assert.assertEquals("Unterminated comment at path /root/text()", e.getMessage()); } }
@Test public void emptyTag() throws IOException { String xml = "<empty />"; XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertFalse(reader.hasAttribute()); reader.nextElementName(); reader.endElement(); }
@Test public void notADocTypeDefinitionButSameDoctypeAsTag() throws IOException { String xml = "<!DOCTYPE foo><!DOCTYPE bar><DOCTYPE />"; XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertEquals("DOCTYPE", reader.nextElementName()); Assert.assertFalse(reader.hasElement()); }
@Test public void failSkipAttribute() throws IOException { String xml = "<foo />"; XmlReader reader = readerFrom(xml); reader.beginElement(); reader.nextElementName(); exception.expect(IOException.class); exception.expectMessage("Expected xml element attribute name but was ELEMENT_END at path /foo"); reader.skipAttribute(); reader.endElement(); }
@Test public void attributeWithDoubleEqualsSign() throws IOException { String xml = "<element a==\"qwe\"></element>"; XmlReader reader = readerFrom(xml); try { reader.beginElement(); reader.nextElementName(); reader.nextAttributeName(); exception.expect(IOException.class); reader.nextAttributeValue(); } finally { reader.close(); } }
@Test public void attributeNoQuotes() throws IOException { String xml = "<element a=qwe></element>"; XmlReader reader = readerFrom(xml); try { reader.beginElement(); reader.nextElementName(); reader.nextAttributeName(); exception.expect(IOException.class); reader.nextAttributeValue(); } finally { reader.close(); } }
@Test public void noElementName() throws IOException { String xml = "<></>"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); exception.expect(IOException.class); exception.expectMessage("Expected xml element name (literal expected) at path /"); reader.nextElementName(); } finally { reader.close(); } }
@Test public void emptyTextContentBoolean() throws IOException { String xml = "<empty />"; XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertFalse(reader.hasAttribute()); reader.nextElementName(); Assert.assertEquals(false, reader.nextTextContentAsBoolean()); reader.endElement(); String xml2 = "<empty></empty>"; XmlReader reader2 = readerFrom(xml2); reader2.beginElement(); Assert.assertFalse(reader2.hasAttribute()); reader2.nextElementName(); Assert.assertEquals(false, reader2.nextTextContentAsBoolean()); reader2.endElement(); }
@Test public void emptyTextContentLong() throws IOException { String xml = "<empty />"; XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertFalse(reader.hasAttribute()); reader.nextElementName(); Assert.assertEquals(0, reader.nextTextContentAsLong()); reader.endElement(); String xml2 = "<empty></empty>"; XmlReader reader2 = readerFrom(xml2); reader2.beginElement(); Assert.assertFalse(reader2.hasAttribute()); reader2.nextElementName(); Assert.assertEquals(0, reader2.nextTextContentAsLong()); reader2.endElement(); }
@Test public void xmlTagsAndAttributesWithNewLines() throws IOException { String xml = "<root\nanAttribute=\"1\"\n attributeWithWhiteSpace=\"2\" \n/>"; XmlReader reader = readerFrom(xml); reader.beginElement(); Assert.assertEquals("root", reader.nextElementName()); Assert.assertEquals("anAttribute", reader.nextAttributeName()); Assert.assertEquals(1, reader.nextAttributeValueAsInt()); Assert.assertEquals("attributeWithWhiteSpace", reader.nextAttributeName()); Assert.assertEquals("2", reader.nextAttributeValue()); reader.endElement(); }
@Test public void validWithWhitespaces() throws IOException { String xml = "< element a = \"qwe\" ></element>"; XmlReader reader = readerFrom(xml); try { reader.beginElement(); Assert.assertEquals("element", reader.nextElementName()); Assert.assertEquals("a", reader.nextAttributeName()); Assert.assertEquals("qwe", reader.nextAttributeValue()); Assert.assertFalse(reader.hasTextContent()); reader.endElement(); } finally { reader.close(); } }
@Test public void readObjectWithMultilineComment() throws IOException { String xml = "<element><!-- comment \n multiline \n -->Value</element>"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("element", reader.nextElementName()); Assert.assertTrue(reader.hasTextContent()); Assert.assertEquals(reader.nextTextContent(), "Value"); reader.endElement(); Assert.assertEquals(XmlReader.XmlToken.END_OF_DOCUMENT, reader.peek()); } finally { reader.close(); } }
@Test public void emptyTextContent() throws IOException { String xml = "<element></element>"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("element", reader.nextElementName()); Assert.assertFalse(reader.hasTextContent()); reader.endElement(); Assert.assertFalse(reader.hasElement()); Assert.assertEquals(XmlReader.XmlToken.END_OF_DOCUMENT, reader.peek()); } finally { reader.close(); } }
@Test public void missingClosingCDATA() throws IOException { String cdata = "< hello <> & cdata</foo>"; String xml = "<foo>NormalValue<![CDATA[" + cdata + "nextvalue</foo>"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("foo", reader.nextElementName()); Assert.assertFalse(reader.hasAttribute()); Assert.assertTrue(reader.hasTextContent()); Assert.assertEquals("NormalValue", reader.nextTextContent()); exception.expect(IOException.class); exception.expectMessage("<![CDATA[ at /foo/text() has never been closed with ]]>"); Assert.assertEquals(cdata, reader.nextTextContent()); } finally { reader.close(); } }
@Test public void inlineClosing() throws IOException { String xml = "<element a='foo' />"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("element", reader.nextElementName()); Assert.assertTrue(reader.hasAttribute()); Assert.assertEquals("a", reader.nextAttributeName()); Assert.assertEquals("foo", reader.nextAttributeValue()); Assert.assertEquals(XmlReader.XmlToken.ELEMENT_END, reader.peek()); reader.endElement(); Assert.assertEquals(XmlReader.XmlToken.END_OF_DOCUMENT, reader.peek()); } finally { reader.close(); } }