1

I have a list like ["010WE" "021WG" "022X" .... "xxx"]

I would like to create/or overwrite a xml file based on below template:

<?xml version="1.0" encoding="UTF-8"?>
<sweep runs="1">
   <parameter name="Date" type="number" number_type="int" start="2" end="4" step="1">
      <parameter name="table" type="list" value_type="java.lang.String" values="010WE 021WG 022X" />
   </parameter>
</sweep>

The only dynamic part is values="010WE 021WG 022X", which is read from a given list.

Appreciate a demo of how to do this using Python or Java.

5
  • do you want to replace values in parameter tag with new list of values? Is that your question Commented Jun 4, 2020 at 17:41
  • You can use jinja templates to do that jinja.palletsprojects.com/en/2.11.x Commented Jun 4, 2020 at 17:44
  • so far yes. I have a CSV file contains a list of codes like ["010WE" "021WG" "022X" .... "xxx"], everytime when I read the different CSV file will have different list of codes. So I need to update the value in parameter tag with new list of values. In the future, I may also need to add new parameters and its associated value. Commented Jun 4, 2020 at 17:45
  • @Sushanth appreaciate for a simple domo. Commented Jun 4, 2020 at 17:46
  • 3
    We will not do your entire homework for you, only help you with it. Show us your code and focus on a specific problem you're having. Tell us what you already understood, where you are struggling, and what you've tried. Commented Jun 4, 2020 at 17:51

3 Answers 3

1

Solution:

This python script will generate an example.xml in root directory of your project:

import xml.etree.ElementTree as ET


def prettify(element, indent='  '):
    queue = [(0, element)]  # (level, element)
    while queue:
        level, element = queue.pop(0)
        children = [(level + 1, child) for child in list(element)]
        if children:
            element.text = '\n' + indent * (level+1)  # for child open
        if queue:
            element.tail = '\n' + indent * queue[0][0]  # for sibling open
        else:
            element.tail = '\n' + indent * (level-1)  # for parent close
        queue[0:0] = children  # prepend so children come before siblings


def create_xml(input_list):
    xml_doc = ET.Element('sweep', runs='1')
    parameter = ET.SubElement(xml_doc, 'parameter', name='Date', type='number', number_type='int', start='2', end='4', step='1')
    ET.SubElement(parameter, 'parameter', name='table', type='list', value_type='java.lang.String', values=' '.join(input_list))
    prettify(xml_doc)
    tree = ET.ElementTree(xml_doc)
    tree.write('example.xml', encoding='UTF-8', xml_declaration=True)


def main():
    some_list = ['010WE', '021WG', '022X']
    create_xml(some_list)


if __name__ == '__main__':
    main()

Answer based on post: Pretty printing XML in Python

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

Comments

1

Java Approach. I have used JDK 8 which gives in-build SAX Parser.

abc.xml :

<?xml version="1.0" encoding="UTF-8"?>
<sweep runs="1">
   <parameter name="Date" type="number" number_type="int" start="2" end="4" step="1">
      <parameter name="table" type="list" value_type="java.lang.String" values="" />
   </parameter>
</sweep>

Example.java :

import java.io.File;
import java.util.Arrays;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Example {

    public static void main(String[] args)
            throws ParserConfigurationException, SAXException, TransformerException {
        List<String> values = Arrays.asList("010WE", "021WG", "022X");
        // Read xml
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        File file = new File("D:/abc.xml");
        Document document = documentBuilder.parse(file);
        NodeList list = document.getElementsByTagName("parameter");
        for (int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);
            NamedNodeMap map = node.getAttributes();
            if (map.getNamedItem("name").getNodeValue().equalsIgnoreCase("table")) {
                map.getNamedItem("values").setNodeValue(
                        values.toString().replace(",", "").replaceAll("\\s+", " ").replace("[", "").replace("]", ""));
            }

        }
        // modify xml by overwriting it.
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        document.setXmlStandalone(true);
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(file);
        transformer.transform(source,result);
    }

}

Modified abc.xml :

<?xml version="1.0" encoding="UTF-8"?>
<sweep runs="1">
   <parameter end="4" name="Date" number_type="int" start="2" step="1" type="number">
      <parameter name="table" type="list" value_type="java.lang.String" values="010WE 021WG 022X"/>
   </parameter>
</sweep>

Comments

0

Below

XML_TEMPLATE = '''    
<?xml version="1.0" encoding="UTF-8"?>
<sweep runs="1">
   <parameter name="Date" type="number" number_type="int" start="2" end="4" step="1">
      <parameter name="table" type="list" value_type="java.lang.String" values="{}" />
   </parameter>
</sweep> '''

values = ['a','b','c']

xml = XML_TEMPLATE.format(' '.join(values))
print(xml)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.