aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/renderers.py
diff options
context:
space:
mode:
authorTom Christie2013-02-22 12:36:52 +0000
committerTom Christie2013-02-22 19:46:47 +0000
commita39de47cc7e6861a1d06b8ab1893f7358cf281f9 (patch)
tree05fb23ee5c38e6fcef5946699aaa05213a8b6df8 /rest_framework/renderers.py
parent3ad5ebaea62471863cb79e66b4414eef9002effa (diff)
downloaddjango-rest-framework-a39de47cc7e6861a1d06b8ab1893f7358cf281f9.tar.bz2
XML cleanup
Diffstat (limited to 'rest_framework/renderers.py')
-rw-r--r--rest_framework/renderers.py38
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):