libraries/edge/opensearch/rssresponse.py (107 lines of code) (raw):
import logging
from xml.dom.minidom import Document
import xml.sax.saxutils
from edge.opensearch.response import Response
class RssResponse(Response):
def __init__(self):
super(RssResponse, self).__init__()
self.namespaces = {
'opensearch': 'http://a9.com/-/spec/opensearch/1.1/',
'podaac': 'http://podaac.jpl.nasa.gov/opensearch/',
'georss': 'http://www.georss.org/georss',
'gml': 'http://www.opengis.net/gml',
'time': 'http://a9.com/-/opensearch/extensions/time/1.0/',
'atom': 'http://www.w3.org/2005/Atom'
}
self.title = None
self.link = None
self.description = None
self.variables = []
self.items = []
self.parameters = {}
def addNamespace(self, name, uri):
self.namespaces[name] = uri
def removeNamespace(self, name):
del self.namespaces[name]
def generate(self, pretty=False):
logging.debug('RssResponse.generate is called.')
document = Document()
rss = document.createElement('rss')
rss.setAttribute('version', '2.0')
for namespace in list(self.namespaces.keys()):
rss.setAttribute('xmlns:'+namespace, self.namespaces[namespace])
document.appendChild(rss)
channel = document.createElement('channel')
rss.appendChild(channel)
title = document.createElement('title')
channel.appendChild(title)
title.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.title)))
description = document.createElement('description')
channel.appendChild(description)
description.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.description)))
link = document.createElement('link')
channel.appendChild(link)
link.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.link)))
for variable in self.variables:
'''
elementName = variable['name']
if 'namespace' in variable:
elementName = variable['namespace']+':'+elementName
variableElement = document.createElement(elementName)
channel.appendChild(variableElement)
variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(variable['value']))))
'''
self._createNode(document, variable, channel)
for item in self.items:
itemElement = document.createElement('item')
channel.appendChild(itemElement)
for itemEntry in item:
self._createNode(document, itemEntry, itemElement);
'''
elementName = itemEntry['name']
if 'namespace' in itemEntry:
elementName = itemEntry['namespace']+':'+elementName
variableElement = document.createElement(elementName)
itemElement.appendChild(variableElement)
value = itemEntry['value']
if isinstance(value, list):
if len(value) > 1:
for valueEntry in value:
valueName = 'value'
if 'namespace' in itemEntry:
valueName = itemEntry['namespace']+':'+valueName
valueElement = document.createElement(valueName)
variableElement.appendChild(valueElement)
valueElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(valueEntry))))
else:
variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value[0]))))
elif isinstance(value, dict):
for key in value.keys():
valueName = key
if 'namespace' in itemEntry:
valueName = itemEntry['namespace']+':'+valueName
valueElement = document.createElement(valueName)
variableElement.appendChild(valueElement)
valueElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value[key]))))
else:
variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value))))
'''
return document.toprettyxml() if pretty else document.toxml('utf-8')
def _createNode(self, document, itemEntry, itemElement):
elementName = itemEntry['name']
if 'namespace' in itemEntry:
elementName = itemEntry['namespace']+':'+elementName
variableElement = document.createElement(elementName)
itemElement.appendChild(variableElement)
if 'value' in itemEntry:
value = itemEntry['value']
if isinstance(value, list):
for valueEntry in value:
self._createNode(document, valueEntry, variableElement)
elif isinstance(value, dict):
self._createNode(document, value, variableElement)
else:
variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value))))
if 'attribute' in itemEntry:
for attr in list(itemEntry['attribute'].keys()):
variableElement.setAttribute(attr, itemEntry['attribute'][attr])