public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {

    ChartModel chartModel = new ChartModel();
    chartModel.setChartEngineId(reader.getAttribute("chartEngine"));

    String attribute = reader.getAttribute("theme");
    if (attribute != null) {
      try {
        chartModel.setTheme(Enum.valueOf(ChartTheme.class, attribute.toUpperCase()));
      } catch (Exception e) {
        // Do nothing
      }
    }

    String cssStyle = reader.getAttribute("style");
    if (cssStyle != null) {
      chartModel.getStyle().setStyleString(cssStyle);
    }

    while (reader.hasMoreChildren()) {
      reader.moveDown();
      if (reader.getNodeName().equals("title")) {
        String title = reader.getValue();
        if (title != null) {
          chartModel.getTitle().setText(title);
        }
        cssStyle = reader.getAttribute("style");
        if (cssStyle != null) {
          chartModel.getTitle().getStyle().setStyleString(cssStyle);
        }
        attribute = reader.getAttribute("location");
        if (attribute != null) {
          try {
            chartModel
                .getTitle()
                .setLocation(Enum.valueOf(TitleLocation.class, attribute.toUpperCase()));
          } catch (Exception e) {
            // Do nothing
          }
        }
      } else if (reader.getNodeName().equals("subtitle")) {
        String subtitle = reader.getValue();
        if ((subtitle != null) && (subtitle.trim().length() > 0)) {
          StyledText styledText = new StyledText(subtitle);
          cssStyle = reader.getAttribute("style");
          if (cssStyle != null) {
            styledText.getStyle().setStyleString(cssStyle);
          }
          chartModel.getSubtitles().add(styledText);
        }
      } else if (reader.getNodeName().equals("legend")) {
        chartModel.getLegend().setVisible(true);
        cssStyle = reader.getAttribute("style");
        if (cssStyle != null) {
          chartModel.getLegend().getStyle().setStyleString(cssStyle);
        }
      } else if (reader.getNodeName().equals("barPlot")
          || reader.getNodeName().equals("linePlot")
          || reader.getNodeName().equals("areaPlot")
          || reader.getNodeName().equals("piePlot")
          || reader.getNodeName().equals("dialPlot")
          || reader.getNodeName().equals("scatterPlot")) {
        chartModel.setPlot(createPlot(reader));
      }
      reader.moveUp();
    }

    return chartModel;
  }