2014-04-01 59 views
2

我當前的代碼是如何使用Python的lxml.objectify創建非嵌套的xml元素?

xml_obj = lxml.objectify.Element('root_name') 
xml_obj[root_name] = str('text') 
lxml.etree.tostring(xml_obj) 

但是這將創建下列XML:

<root_name><root_name>text</root_name></root_name> 

在應用程序中,我用這個,因爲我可以很容易地使用文本替換來解決這個問題,但它會很高興知道如何使用庫來做到這一點。

回答

2

我沒那麼熟悉objectify,但我不認爲這是它打算使用的方式。它表示對象的方式是任何給定級別的節點都是類名稱,子節點是字段名稱(帶有類型)和值。和正常的方式來使用它會更多的東西是這樣的:

xml_obj = lxml.objectify.Element('xml_obj') 
xml_obj.root_path = 'text' 
etree.dump(xml_obj) 
<root_name xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" py:pytype="TREE"> 
    <root_name py:pytype="str">text</root_name> 
</root_name> 

你想會是比較容易的方式與etree做什麼:

xml_obj = lxml.etree.Element('root_path') 
xml_obj.text = 'text' 
etree.dump(xml_obj) 
<root_path>text</root_path> 

如果你真的需要它是在objectify,它看起來像你不應該直接混合,你可以使用tostring生成XML,然後objectify.fromstring把它帶回來。但可能的話,如果這是你想要的,你應該使用etree來生成它。

+0

謝謝!我一直在使用Objectify,因爲我對它很熟悉,但你對etree完全正確。 –

1

我不認爲你可以寫數據到根元素。您可能需要創建一個子元素是這樣的:

xml_obj = lxml.objectify.Element('root_name') 
xml_obj.child_name = str('text') 
lxml.etree.tostring(xml_obj)