0

I need to Create an XML file which takes N as an input from user and looks like this (here, 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> 

So, in order to make this, I have created the following code, as shown below:

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

Here, for N_users = 1, the code is working fine but for N_users > 1, it is giving following output in internet explorer:

<parameter name="username" value="bhusriva1" /> <class name="bhuv.mllab.tests.DensityTest" />

So, what is needed to be corrected in the code? A completely new code with some different library usage is also fine with me.

1 Answer 1

1

A couple of issues with your code. First, if you use root.text, then the < and > get replaced by the string escape versions ( &gt and &lt ). Secondly, you don't have to maintain so many counters. Python does it for you directly! If we fix these 2 issues (I've added comments to explain what's going on) and clean up the logic a little then we get the following:

 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)

Running this gives the output:

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

Hope this helps!

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.