2017-03-09 27 views
0

我需要創建一個XML文件,這需要N作爲一個來自用戶的輸入,看起來像這樣的XML文件(這裏,N = 3):文本追加到使用Python元素樹庫

<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" /> 

那麼,在代碼中需要糾正什麼?有一些不同的庫用法的全新代碼對我來說也很好。

回答

0

幾個問題與您的代碼。首先,如果您使用root.text,那麼將<和>替換爲字符串轉義版本(& gt和& lt)。其次,你不必保持這麼多的櫃檯。 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> 

希望這有助於!