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.

Anish B.
  • 9,111
  • 3
  • 21
  • 41
Jack
  • 1,339
  • 1
  • 12
  • 31
  • do you want to replace `values ` in parameter tag with new list of values? Is that your question – deadshot Jun 04 '20 at 17:41
  • You can use ``jinja`` templates to do that https://jinja.palletsprojects.com/en/2.11.x/ – sushanth Jun 04 '20 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. – Jack Jun 04 '20 at 17:45
  • @Sushanth appreaciate for a simple domo. – Jack Jun 04 '20 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](https://stackoverflow.com/help/how-to-ask). – Olli Jun 04 '20 at 17:51

3 Answers3

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>
Anish B.
  • 9,111
  • 3
  • 21
  • 41
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

kaspiotr
  • 558
  • 1
  • 9
  • 11
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)
balderman
  • 22,927
  • 7
  • 34
  • 52