2014-02-14 185 views
0

我正在試圖用django從數據中創建xml文件。用django創建嵌套結構xml

下面是數據列表,我得到了:

PAGE PARENT  TAG 
1  parenttagA tag1 
1  parenttagA tag2 
1  parenttagB tag3 
1  parenttagB tag4 
2  parenttagC tag5 
2  parenttagC tag6... 

...我想打一個xml文件如下:

<?xml version="1.0" encoding="UTF-8"?> 
<TAGS> 
    <PAGE page="1"> 
    <PARENT parent="parenttagA"> 
     <TAG>tag1</TAG> 
     <TAG>tag2</TAG> 
    </PARENT> 
    <PARENT parent="parenttagB"> 
     <TAG>tag3</TAG> 
     <TAG>tag4</TAG> 
    </PARENT> 
    </PAGE> 
    <PAGE page="2"> 
    <PARENT parent="parenttagC"> 
     <TAG>tag5</TAG> 
     <TAG>tag6</TAG>... 
</TAGS> 

我有for標籤攻擊的問題,但我無法弄清楚,因爲標籤是嵌套的,「PAGE」和「PARENT」標籤不能重複寫入。我也試着用ififchanged標籤的組合來解決這個問題。雖然這使我接近我的預期,但當forloop.counter爲2時總是會觸發ifchanged。另外我還認爲可能有更簡單的解決方案,但我並不知道。

如果對這個問題有一個合理的解決方案,請幫助我。


我凌亂的代碼:

{% for data in datas %} 

    {% if forloop.counter == 1 %} 
    <PAGE page="{{data.pagenum}}"> 
    <PARENT parent="{{data.parenttag}}"> 
     <TAG>{{ data.tag }}</TAG> 
    {% else %} 

    {% if forloop.revcounter == 1 %} 
     <TAG>{{ data.tag }}</TAG> 
    </PARENT> 
    </PAGE> 

    {% else %} 
     {% ifchanged data.pagenum %} 
    </PAGE> 
    <PAGE page="{{data.pagenum}}"> 
    <PARENT parent="{{data.parenttag}}"> 
     <TAG>{{ data.tag }}</TAG> 

     {% else %} 
     {% ifchanged data.parenttag %} 
    </PARENT> 
    <PARENT parent="{{data.parenttag}}"> 
     {% endifchanged %} 
     <TAG>{{ data.tag }}</TAG> 

     {% endifchanged %} 

    {% endif %} 
    {% endif %} 
{% endfor %} 

回答

0

更先進的解決方案,我想出!

所以regroup可以被嵌套和我的代碼應該看起來像這樣的:

{% regroup datas by pagenum as pagenum_list %} 
{% for pagenum in pagenum_list %} 
<TAGS> 
    <PAGE page="{{pagenum.grouper}}"> 
    {% regroup pagenum.list by parenttag as parenttag_list %} 
    {% for parenttag in parenttag_list %} 
    <PARENT parent="{{parenttag.grouper}}"> 
     {% regroup parenttag.list by tag as tag_list %} 
     {% for tag in tag_list %} 
     <TAG>{{tag.grouper}}</TAG> 
     {% endfor %} 
    </PARENT> 
    {% endfor %} 
    </PAGE> 
</TAGS> 
{% endfor %}