diff options
| author | Tom Christie | 2013-02-22 12:36:52 +0000 |
|---|---|---|
| committer | Tom Christie | 2013-02-22 19:46:47 +0000 |
| commit | a39de47cc7e6861a1d06b8ab1893f7358cf281f9 (patch) | |
| tree | 05fb23ee5c38e6fcef5946699aaa05213a8b6df8 /rest_framework/renderers.py | |
| parent | 3ad5ebaea62471863cb79e66b4414eef9002effa (diff) | |
| download | django-rest-framework-a39de47cc7e6861a1d06b8ab1893f7358cf281f9.tar.bz2 | |
XML cleanup
Diffstat (limited to 'rest_framework/renderers.py')
| -rw-r--r-- | rest_framework/renderers.py | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 65568023..d041dd4f 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -15,14 +15,17 @@ from django import forms from django.http.multipartparser import parse_header from django.template import RequestContext, loader, Template from django.utils.encoding import force_unicode +from django.utils.xmlutils import SimplerXMLGenerator from rest_framework.compat import yaml from rest_framework.exceptions import ConfigurationError from rest_framework.settings import api_settings from rest_framework.request import clone_request -from rest_framework.utils import dict2xml from rest_framework.utils import encoders from rest_framework.utils.breadcrumbs import get_breadcrumbs from rest_framework import exceptions, parsers, status, VERSION +from rest_framework.compat import StringIO +from rest_framework.compat import six +from rest_framework.compat import smart_text class BaseRenderer(object): @@ -119,7 +122,38 @@ class XMLRenderer(BaseRenderer): """ if data is None: return '' - return dict2xml(data) + + stream = StringIO() + + xml = SimplerXMLGenerator(stream, "utf-8") + xml.startDocument() + xml.startElement("root", {}) + + self._to_xml(xml, data) + + xml.endElement("root") + xml.endDocument() + return stream.getvalue() + + def _to_xml(self, xml, data): + if isinstance(data, (list, tuple)): + for item in data: + xml.startElement("list-item", {}) + self._to_xml(xml, item) + xml.endElement("list-item") + + elif isinstance(data, dict): + for key, value in six.iteritems(data): + xml.startElement(key, {}) + self._to_xml(xml, value) + xml.endElement(key) + + elif data is None: + # Don't output any value + pass + + else: + xml.characters(smart_text(data)) class YAMLRenderer(BaseRenderer): |
