2016-10-31 125 views
-3

這是我的工作的XML:排序XML的價值與蟒蛇

<hotspot> 
    <position> 
     <pan>-102.698</pan> 
     <tilt>-62.5853</tilt> 
    </position> 
    <next> 
     <pan>0</pan> 
     <tilt>0</tilt> 
     <fov>70</fov> 
    </next> 
    <polygon/> 
    <type>point</type> 
    <id>Test Name 1</id> 
    <title>Test Name 1</title> 
    <linktype>info</linktype> 
    <skinid>skin-id-1</skinid> 
    </hotspot> 
    <hotspot> 
    <position> 
     <pan>-109.553</pan> 
     <tilt>-69.7479</tilt> 
    </position> 
    <next> 
     <pan>0</pan> 
     <tilt>0</tilt> 
     <fov>70</fov> 
    </next> 
    <polygon/> 
    <type>point</type> 
    <id>Test Name 2</id> 
    <title>Test Name 2</title> 
    <linktype>info</linktype> 
    <skinid>skin-id-1</skinid> 
    </hotspot> 
    <hotspot> 
    <position> 
     <pan>-95.4268</pan> 
     <tilt>-55.4989</tilt> 
    </position> 
    <next> 
     <pan>0</pan> 
     <tilt>0</tilt> 
     <fov>70</fov> 
    </next> 
    <polygon/> 
    <type>point</type> 
    <id>Test Name 3</id> 
    <title>Test Name 3</title> 
    <linktype>info</linktype> 
    <skinid>skin-id-1</skinid> 
    </hotspot> 

我試圖做的是通過「傾斜」標籤中的「熱點」標籤內的所有排序的下「位置」標籤,而不是「下一個」標籤下的「傾斜」標籤。

這是我希望它看起來:

<hotspot> 
    <position> 
     <pan>-109.553</pan> 
     <tilt>-69.7479</tilt> 
    </position> 
    <next> 
     <pan>0</pan> 
     <tilt>0</tilt> 
     <fov>70</fov> 
    </next> 
    <polygon/> 
    <type>point</type> 
    <id>Test Name 2</id> 
    <title>Test Name 2</title> 
    <linktype>info</linktype> 
    <skinid>skin-id-1</skinid> 
    </hotspot> 
    <hotspot> 
    <position> 
     <pan>-102.698</pan> 
     <tilt>-62.5853</tilt> 
    </position> 
    <next> 
     <pan>0</pan> 
     <tilt>0</tilt> 
     <fov>70</fov> 
    </next> 
    <polygon/> 
    <type>point</type> 
    <id>Test Name 1</id> 
    <title>Test Name 1</title> 
    <linktype>info</linktype> 
    <skinid>skin-id-1</skinid> 
    </hotspot> 
    <hotspot> 
    <position> 
     <pan>-95.4268</pan> 
     <tilt>-55.4989</tilt> 
    </position> 
    <next> 
     <pan>0</pan> 
     <tilt>0</tilt> 
     <fov>70</fov> 
    </next> 
    <polygon/> 
    <type>point</type> 
    <id>Test Name 3</id> 
    <title>Test Name 3</title> 
    <linktype>info</linktype> 
    <skinid>skin-id-1</skinid> 
    </hotspot> 

我希望用Python來實現這一點,但如果有一個更好的辦法,讓我知道。謝謝!

+1

寫,它大約要達到什麼樣的一些Python代碼,後它在這裏並得到反饋。 – Ukimiku

+1

*旁白*:那不是XML。特別是它缺少一個根元素。 –

回答

1

這個程序可能會做你想要什麼:

from lxml import etree 

# Read the file in 
with open('x.xml') as in_file: 
    xml = etree.parse(in_file) 
    root = xml.getroot() 

# sort the data according to the criteria 
root[:] = sorted(
    root[:], 
    key=lambda hotspot: float(hotspot.find('./position/tilt').text)) 

# Write the file out 
with open('x-out.xml', 'w') as out_file: 
    xml.write(out_file) 

該程序假定您的XML具有以下形式:

<root> 
    <hotspot> ... </hotspot> 
    <hotspot> ... </hotspot> 
    ... 
    <hotspot> ... </hotspot> 
</root> 
+0

我很欣賞這種迴應!當我運行這個時,我得到:「AttributeError:'NoneType'對象沒有屬性'文本'」。錯誤在「key = lambda hotspot:float(hotspot.find('./ position/tilt')。text))」行。 – TeaBoneJones

+0

這可能意味着您的輸入XML不符合程序預期的格式。具體來說,'.find()'沒有找到'tilt'元素。修改程序以匹配輸入。 –

+0

是的,你在其他評論中是正確的,我的文件在技術上不是xml,而且它沒有根元素。一旦我添加了,你的代碼完美無瑕!謝謝! – TeaBoneJones