如果这不是发布此内容的正确区域,我提前道歉,但我似乎无法在文档或Stack Overflow中找到任何帮助。 TastyPie很棒,我已经能够非常接近所需的XML输出。但是,当我想在节点上拥有自定义属性时会出现问题。我似乎无法通过TastyPie找到一种方法来禁止从头开始编写API。
例如,假设我有来自TastyPie的此示例输出(仅摘录):
<media type="list">
<object type="hash">
<filename>filename.mp4</filename>
<id type="integer">62</id>
<name>AE</name>
<position type="integer">0</position>
<product type="integer">65</product>
<type>video</type>
</object>
<object type="hash">
<filename>filename.jpg</filename>
<id type="integer">63</id>
<name>Some Name</name>
<position type="integer">1</position>
<product type="integer">65</product>
<type>image</type>
</object>
</media>
我真正需要的是这个(注意我想向节点添加一个自定义属性(或属性) - 在这种情况下,filename有一个属性):
<media type="list">
<object type="hash">
<filename type="video">filename.mp4</filename>
<id type="integer">62</id>
<name>Some Name</name>
<position type="integer">0</position>
<product type="integer">65</product>
</object>
<object type="hash">
<filename type="image">filename.jpg</filename>
<id type="integer">63</id>
<name>Another Name</name>
<position type="integer">1</position>
<product type="integer">65</product>
</object>
</media>
甚至更好,这个:
<media type="list">
<object type="hash" format="video" id="62" position="0" product_type="65" filename="filename.mp4" name="Some Name" />
<object type="hash" format="image" id="63" position="1" product_type="65" filename="filename.jpg" name="Another Name" />
</media>
为了自定义XML序列化程序以在需要时添加属性,需要什么? 甚至更好,告诉它哪些值可以安全地描述为属性而不是节点?我不明白如何将属性添加到输出XML。任何帮助是极大的赞赏。提前谢谢。
答案 0 :(得分:1)
嗯,我得到了答案,但不是我自己的答案。感谢波兰的Omelyanyk Andrey为这个工作代码...这让我到了我需要的地方,并允许我进一步定制,因为我有工作代码可供学习。
class MySerializer(Serializer):
def format_datetime(self, data):
return utc_to_est_human(data)
def format_date(self, data):
return data.strftime("%Y-%m-%d")
def to_xml(self, data, options=None):
"""
Given some Python data, produces XML output.
"""
options = options or {}
if lxml is None:
raise ImproperlyConfigured("Usage of the XML aspects requires lxml and defusedxml.")
etree = self.to_etree(data, options)
for element in etree.xpath('//media/object'):
for child in element.getchildren():
element.set(child.tag, child.text)
element.remove(child)
return tostring(etree, encoding='utf-8')