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; }
if (reader.hasAttribute()) { while (reader.hasAttribute()) { String attributeName = reader.nextAttributeName(); AttributeBinder<T> attributeBinder = attributeBinders.get(attributeName); + attributeName + "' at path " + reader.getPath() + "to java class. Have you annotated such a field in your java class to map this xml attribute? Otherwise you can turn this error message off with TikXml.Builder().exceptionOnUnreadXml(false).build()."); } else { reader.skipAttributeValue(); while (reader.hasAttribute()) { reader.skipAttribute(); if (childElementBinders != null && reader.hasElement()) { reader.beginElement(); String elementName = reader.nextElementName(); ChildElementBinder<T> childElementBinder = childElementBinders.get(elementName); if (childElementBinder != null) { childElementBinder.fromXml(reader, config, value); reader.endElement(); } else { if (config.exceptionOnUnreadXml()) {
/** * Consumes the next attribute's value and returns it as an integer. Assumes that {@link * #nextAttributeName()} has been called before invoking this method * * @return the attributes value as an integer * @throws IOException */ public int nextAttributeValueAsInt() throws IOException { // TODO natively support integer return Integer.parseInt(nextAttributeValue()); }
/** * Skip the entire attribute (attribute name and attribute value) * * @throws IOException */ public void skipAttribute() throws IOException { nextAttributeName(); skipAttributeValue(); }
/** * Consumes the next token from the JSON stream and asserts that it is the beginning of a new * object. */ public void beginElement() throws IOException { int p = peeked; if (p == PEEKED_NONE) { p = doPeek(); } if (p == PEEKED_ELEMENT_BEGIN) { pushStack(XmlScope.ELEMENT_OPENING); peeked = PEEKED_NONE; } else { throw new XmlDataException("Expected " + XmlToken.ELEMENT_BEGIN + " but was " + peek() + " at path " + getPath()); } }
@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 xmlTagsAndAttributesWithNewLinesAndMultilineTextContent() throws IOException { String xml = "<root\nanAttribute=\"1\"\n attributeWithWhiteSpace=\"2\" \n \t\tattributeWithTabs=\"20.2\">\n<child>Contains\nmulitlines\n</child>\n</root>"; 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()); Assert.assertEquals("attributeWithTabs", reader.nextAttributeName()); Assert.assertEquals(20.2, reader.nextAttributeValueAsDouble(), 0); Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("child", reader.nextElementName()); Assert.assertEquals("Contains\nmulitlines\n", reader.nextTextContent()); reader.endElement(); reader.endElement(); Assert.assertFalse(reader.hasElement()); }
@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 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(); } }
while (reader.hasAttribute()) { if (reader.nextAttributeName().equals("id")) { book.id = reader.nextAttributeValue(); } else { reader.skipAttributeValue(); while (reader.hasElement()) { boolean skipped = false; reader.beginElement(); String elementName = reader.nextElementName(); if (elementName.equals("author")) { book.author = reader.nextTextContent(); } else if (elementName.equals("title")) { book.title = reader.nextTextContent(); } else if (elementName.equals("genre")) { book.genre = reader.nextTextContent(); } else if (elementName.equals("price")) { book.price = Double.parseDouble(reader.nextTextContent()); } else if (elementName.equals("description")) { book.description = reader.nextTextContent(); } else { reader.skipRemainingElement(); skipped = true; reader.endElement();
@Test public void skipRemainingElement() throws IOException { String xml = "<foo><e1></e1><bar a='1' b='2'>TextContent<child a='1'>Child text Value<other b='123'>Text<inline /></other></child> <![CDATA[some <cdata></> &]]> </bar>TextAfterSkippedElement<element></element></foo>"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("foo", reader.nextElementName()); reader.beginElement(); Assert.assertEquals("e1", reader.nextElementName()); reader.endElement(); reader.beginElement(); // <bar> element reader.skipRemainingElement(); // skip <bar> Assert.assertEquals("TextAfterSkippedElement", reader.nextTextContent()); reader.beginElement(); Assert.assertEquals("element", reader.nextElementName()); reader.endElement(); reader.endElement(); // end <foo> } finally { reader.close(); } }
@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(); } }
switch (peek()) { case ELEMENT_BEGIN: beginElement(); count++; break; endElement(); count--; break; nextElementName(); // TODO add a skip element name method break; nextAttributeName(); // TODO add a skip attribute name method break; skipAttributeValue(); break; skipTextContent(); break; throw syntaxError("Unexpected end of file! At least one xml element is not closed!");
Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("foo", reader.nextElementName()); Assert.assertEquals("aString", reader.nextAttributeName()); Assert.assertEquals("a very short string", reader.nextAttributeValue()); Assert.assertEquals("aString2", reader.nextAttributeName()); Assert.assertEquals("a very short string", reader.nextAttributeValue()); Assert.assertEquals("anInt", reader.nextAttributeName()); Assert.assertEquals(intMax, reader.nextAttributeValueAsInt()); Assert.assertEquals("anInt2", reader.nextAttributeName()); Assert.assertEquals(intMax, reader.nextAttributeValueAsInt()); Assert.assertEquals("aLong", reader.nextAttributeName()); Assert.assertEquals(longMax, reader.nextAttributeValueAsLong()); Assert.assertEquals("aLong2", reader.nextAttributeName()); Assert.assertEquals(longMax, reader.nextAttributeValueAsLong()); Assert.assertEquals("aBool", reader.nextAttributeName()); Assert.assertTrue(reader.nextAttributeValueAsBoolean()); Assert.assertEquals("aBool2", reader.nextAttributeName()); Assert.assertFalse(reader.nextAttributeValueAsBoolean()); Assert.assertEquals("aBool3", reader.nextAttributeName());
@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; }
reader.beginElement(); reader.nextElementName(); Assert.assertEquals("/element", reader.getPath()); reader.nextAttributeName(); Assert.assertEquals("/element[@a]", reader.getPath()); reader.nextAttributeValue(); Assert.assertEquals("/element", reader.getPath()); reader.nextAttributeName(); Assert.assertEquals("/element[@b]", reader.getPath()); reader.nextAttributeValue(); Assert.assertEquals("/element", reader.getPath()); reader.nextTextContent(); Assert.assertEquals("/element/text()", reader.getPath()); reader.beginElement(); reader.nextElementName(); Assert.assertEquals("/element/bar", reader.getPath()); reader.nextAttributeName(); Assert.assertEquals("/element/bar[@a]", reader.getPath()); reader.nextAttributeValue(); Assert.assertEquals("/element/bar", reader.getPath()); reader.endElement(); Assert.assertEquals("/element/text()", reader.getPath()); reader.endElement();
Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("foo", reader.nextElementName()); reader.beginElement(); Assert.assertEquals("aString", reader.nextElementName()); Assert.assertEquals("a very short string", reader.nextTextContent()); reader.endElement(); reader.beginElement(); Assert.assertEquals("intMax", reader.nextElementName()); Assert.assertEquals(Integer.MAX_VALUE, reader.nextTextContentAsInt()); reader.endElement(); reader.beginElement(); Assert.assertEquals("intMin", reader.nextElementName()); Assert.assertEquals(Integer.MIN_VALUE, reader.nextTextContentAsInt()); reader.endElement(); reader.beginElement(); Assert.assertEquals("longMax", reader.nextElementName()); Assert.assertEquals(Long.MAX_VALUE, reader.nextTextContentAsLong()); reader.endElement(); reader.beginElement(); Assert.assertEquals("longMin", reader.nextElementName()); Assert.assertEquals(Long.MIN_VALUE, reader.nextTextContentAsLong()); reader.endElement();
@Test public void skipUncompleteTextContent() throws IOException { String xml = "<foo>Value"; XmlReader reader = readerFrom(xml); try { Assert.assertTrue(reader.hasElement()); reader.beginElement(); Assert.assertEquals("foo", reader.nextElementName()); Assert.assertFalse(reader.hasAttribute()); Assert.assertTrue(reader.hasTextContent()); exception.expect(IOException.class); exception.expectMessage( "Unterminated element text content. Expected </foo> but haven't found at path /foo/text()"); reader.skipTextContent(); } finally { reader.close(); } }
@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 skipAttribute() throws IOException { String xml = "<foo abc=\"123\" />"; XmlReader reader = readerFrom(xml); reader.beginElement(); reader.nextElementName(); reader.skipAttribute(); reader.endElement(); }