From 05c9a4c92a40a20c0ecf9264c3bc70230b047e41 Mon Sep 17 00:00:00 2001 From: Martin Porsch Date: Thu, 18 Feb 2021 10:39:41 +0100 Subject: [PATCH] characters(...) fills StringBuilder instead of String I startet to implement an XML parser from this tutorial and ran into a problem with empty elements, e.g. . I found this SO post (https://stackoverflow.com/questions/44570604/sax-parser-is-not-working-properly-when-xml-input-is-given-as-stream-and-some-xm) and realised, that characters(...) can be called zero or multiple times, so one should fixed it conceptually by using a StringBuffer or StringBuilder. --- .../java/com/baeldung/sax/SaxParserMain.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java index 4908c10386..34a46fe469 100644 --- a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java +++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java @@ -28,11 +28,15 @@ public class SaxParserMain { private static final String CONTENT = "content"; private Baeldung website; - private String elementValue; + private StringBuilder elementValue; @Override public void characters(char[] ch, int start, int length) throws SAXException { - elementValue = new String(ch, start, length); + if (elementValue == null) { + elementValue = new StringBuilder(); + } else { + elementValue.append(ch, start, length); + } } @Override @@ -48,6 +52,13 @@ public class SaxParserMain { break; case ARTICLE: website.getArticleList().add(new BaeldungArticle()); + break; + case TITLE: + elementValue = new StringBuilder(); + break; + case CONTENT: + elementValue = new StringBuilder(); + break; } } @@ -55,10 +66,10 @@ public class SaxParserMain { public void endElement(String uri, String localName, String qName) throws SAXException { switch (qName) { case TITLE: - latestArticle().setTitle(elementValue); + latestArticle().setTitle(elementValue.toString()); break; case CONTENT: - latestArticle().setContent(elementValue); + latestArticle().setContent(elementValue.toString()); break; } }