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):  | 
