2014-04-01 43 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)