使用python/java生成自定义xml文件

使用python/java生成自定义xml文件,java,python,xml,Java,Python,Xml,我有一个类似于[“010WE”021WG“022X”…“xxx”] 我想基于以下模板创建/或覆盖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" ty

我有一个类似于
[“010WE”021WG“022X”…“xxx”]

我想基于以下模板创建/或覆盖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="010WE 021WG 022X" />
   </parameter>
</sweep>

唯一的动态部分是
values=“010WE 021WG 022X”
,从给定列表中读取

欣赏如何使用Python或Java实现这一点的演示

以下

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)
XML\u模板=“”
'''
值=['a','b','c']
xml=xml_TEMPLATE.format(“”.join(值))
打印(xml)

Java方法。我使用了JDK 8,它提供内置SAX解析器

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

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);
    }

}
导入java.io.File;
导入java.util.array;
导入java.util.List;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Document;
导入org.w3c.dom.NamedNodeMap;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入org.xml.sax.SAXException;
公开课范例{
公共静态void main(字符串[]args)
抛出ParserConfiguration异常、SAXException、TransformerException{
列表值=Arrays.asList(“010WE”、“021WG”、“022X”);
//读取xml
DocumentBuilderFactory DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder DocumentBuilder=documentBuilderFactory.newDocumentBuilder();
File File=新文件(“D:/abc.xml”);
Document Document=documentBuilder.parse(文件);
NodeList list=document.getElementsByTagName(“参数”);
对于(int i=0;i
修改的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>

解决方案

python脚本将在项目的根目录中生成example.xml:

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

根据帖子回答:

是否要用新的值列表替换参数标记中的值?这是您的问题吗?到目前为止,您可以使用
jinja
模板来完成这项工作。是的。我有一个CSV文件包含一个代码列表,如[“010WE”“021WG”“022X”…“xxx”],每次我读取不同的CSV文件时,都会有不同的代码列表。所以我需要用新的值列表更新参数标记中的值。将来,我可能还需要添加新的参数及其关联值。@Sushanth非常感谢一个简单的domo。我们不会为您完成全部作业,只会帮助您完成。向我们展示您的代码,并关注您遇到的特定问题。告诉我们你已经理解了什么,你在哪里挣扎,还有。