使用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。我们不会为您完成全部作业,只会帮助您完成。向我们展示您的代码,并关注您遇到的特定问题。告诉我们你已经理解了什么,你在哪里挣扎,还有。