使用 Python 元素树库将文本附加到 XML 文件
Append text to an XML file using Python element tree library
我需要创建一个 XML 文件,它将 N 作为用户的输入,看起来像这样(这里,N=3):
<test name="test1">
<parameter name="username" value="bhusriva1" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test2">
<parameter name="username" value="bhusriva2" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test3">
<parameter name="username" value="bhusriva3" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
因此,为了做到这一点,我创建了以下代码,如下所示:
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
import xml.etree.ElementTree as etree
#Number of users to create: Edit this part
N_users = 1
#Counter to terminate the loop and ID's
counter = 0
usr_num = 1
root = Element('test')
root.text = '<parameter name="username" value="bhusriva1" />'
tree = ElementTree(root)
name = Element('classes')
root.append(name)
name.text = '\n<class name="bhuv.mllab.tests.DensityTest" />\n'
root.set('name', 'test1')
print(etree.tostring(root))
tree.write(open('create_users_multi_browser.xml', 'w'))
while (N_users - 1) > counter:
counter = counter + 1
usr_num = usr_num + 1
root = Element('test')
temp1 = "<parameter name=" + "\"" + "username"+ "\"" + " value=" + "\"" + "bhusriva" + str(usr_num) + "\"" +" />"
root.text = temp1
tree = ElementTree(root)
name = Element('classes')
root.append(name)
name.text = '<class name="bhuv.mllab.tests.DensityTest" />'
temp2 = "test" + str(usr_num)
root.set('name', temp2)
print(etree.tostring(root))
tree.write(open("create_users_multi_browser.xml", "a"))
在这里,对于 N_users = 1
,代码工作正常,但对于 N_users > 1
,它在 Internet Explorer 中给出以下输出:
<parameter name="username" value="bhusriva1" /> <class name="bhuv.mllab.tests.DensityTest" />
那么,代码中需要修正什么?具有一些不同库用法的全新代码也适合我。
您的代码有几个问题。首先,如果您使用 root.text,则 < 和 > 会被字符串转义版本( > 和 < )替换。其次,您不必维护那么多计数器。 Python 直接给你做!如果我们解决了这两个问题(我添加了评论来解释发生了什么)并稍微清理一下逻辑,那么我们会得到以下内容:
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
import xml.etree.ElementTree as etree
# Number of users to create: Edit this part
users = 3
op = ""
for i in xrange(1, users + 1):
# Create test element
root = Element('test')
root.set('name', 'test' + str(i))
# Create parameter element
params = SubElement(root, 'parameter')
params.set('name' , 'username')
params.set('value', 'bhusriva' + str(i))
# Create classes element
classes = SubElement(root, 'classes')
# Add class subelement
class_element = SubElement(classes, 'class')
class_element.set('name', 'bhuv.mllab.tests.DensityTest')
# Add output to string
op = op + etree.tostring(root)
# Write output to file
with open('create_users_multi_browser.xml', 'w') as f:
f.write(op)
运行 这给出了输出:
<test name="test1">
<parameter name="username" value="bhusriva1" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test2">
<parameter name="username" value="bhusriva2" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test3">
<parameter name="username" value="bhusriva3" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
希望对您有所帮助!
我需要创建一个 XML 文件,它将 N 作为用户的输入,看起来像这样(这里,N=3):
<test name="test1">
<parameter name="username" value="bhusriva1" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test2">
<parameter name="username" value="bhusriva2" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test3">
<parameter name="username" value="bhusriva3" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
因此,为了做到这一点,我创建了以下代码,如下所示:
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
import xml.etree.ElementTree as etree
#Number of users to create: Edit this part
N_users = 1
#Counter to terminate the loop and ID's
counter = 0
usr_num = 1
root = Element('test')
root.text = '<parameter name="username" value="bhusriva1" />'
tree = ElementTree(root)
name = Element('classes')
root.append(name)
name.text = '\n<class name="bhuv.mllab.tests.DensityTest" />\n'
root.set('name', 'test1')
print(etree.tostring(root))
tree.write(open('create_users_multi_browser.xml', 'w'))
while (N_users - 1) > counter:
counter = counter + 1
usr_num = usr_num + 1
root = Element('test')
temp1 = "<parameter name=" + "\"" + "username"+ "\"" + " value=" + "\"" + "bhusriva" + str(usr_num) + "\"" +" />"
root.text = temp1
tree = ElementTree(root)
name = Element('classes')
root.append(name)
name.text = '<class name="bhuv.mllab.tests.DensityTest" />'
temp2 = "test" + str(usr_num)
root.set('name', temp2)
print(etree.tostring(root))
tree.write(open("create_users_multi_browser.xml", "a"))
在这里,对于 N_users = 1
,代码工作正常,但对于 N_users > 1
,它在 Internet Explorer 中给出以下输出:
<parameter name="username" value="bhusriva1" /> <class name="bhuv.mllab.tests.DensityTest" />
那么,代码中需要修正什么?具有一些不同库用法的全新代码也适合我。
您的代码有几个问题。首先,如果您使用 root.text,则 < 和 > 会被字符串转义版本( > 和 < )替换。其次,您不必维护那么多计数器。 Python 直接给你做!如果我们解决了这两个问题(我添加了评论来解释发生了什么)并稍微清理一下逻辑,那么我们会得到以下内容:
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
import xml.etree.ElementTree as etree
# Number of users to create: Edit this part
users = 3
op = ""
for i in xrange(1, users + 1):
# Create test element
root = Element('test')
root.set('name', 'test' + str(i))
# Create parameter element
params = SubElement(root, 'parameter')
params.set('name' , 'username')
params.set('value', 'bhusriva' + str(i))
# Create classes element
classes = SubElement(root, 'classes')
# Add class subelement
class_element = SubElement(classes, 'class')
class_element.set('name', 'bhuv.mllab.tests.DensityTest')
# Add output to string
op = op + etree.tostring(root)
# Write output to file
with open('create_users_multi_browser.xml', 'w') as f:
f.write(op)
运行 这给出了输出:
<test name="test1">
<parameter name="username" value="bhusriva1" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test2">
<parameter name="username" value="bhusriva2" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
<test name="test3">
<parameter name="username" value="bhusriva3" />
<classes>
<class name="bhuv.mllab.tests.DensityTest" />
</classes>
</test>
希望对您有所帮助!