テストなどで使用するXMLファイルを自動で作成するサンプル
5年程前に作成した「テストなどで使用するXMLファイルを自動で作成するサンプルプログラム」のソースを書いておこうと思います。
どのような構造のデータを作成するかはXMLファイルで指定する事ができます。
ソース(XmlTestMain5.java)
package jp.co.hoshisoft.xmltest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
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;
import org.xml.sax.helpers.AttributesImpl;
public class XmlTestMain5 {
public static void main(String args) {
XmlTestMain5 test = new XmlTestMain5();
test.execute("Test5.xml", "result5.xml");
}
public void execute(String xmlPath1, String xmlPath2) {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
TransformerFactory transFactory = TransformerFactory.newInstance();
SAXTransformerFactory saxTransformerFactory = (SAXTransformerFactory) transFactory;
try {
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new File(xmlPath1));
TransformerHandler saxHandler = saxTransformerFactory.newTransformerHandler();
saxHandler.setResult(new StreamResult(new FileOutputStream(xmlPath2)));
saxHandler.startDocument();
Node root = doc.getFirstChild();
putNodeStartTag(root, saxHandler);
NodeList nodeList = root.getChildNodes();
for(int i=0;i<nodeList.getLength();i++) {
Node node = nodeList.item(i);
putNode(node, saxHandler, 0);
}
putNodeEndTag(root, saxHandler);
saxHandler.endDocument();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
}
private void putNode(Node node, TransformerHandler saxHandler, int no) throws SAXException {
switch(node.getNodeType()) {
case Node.TEXT_NODE :
putNodeTextTag(node, saxHandler, no);
break;
case Node.ELEMENT_NODE :
if(node.getNodeName().equals("for")) {
NamedNodeMap map = node.getAttributes();
String numString = map.getNamedItem("num").getNodeValue();
String tagNameString = map.getNamedItem("tagName").getNodeValue();
int num = Integer.parseInt(numString);
for(int i=0;i<num;i++) {
putForNodeStartTag(node, saxHandler);
NodeList nodeList = node.getChildNodes();
for(int j=0;j<nodeList.getLength();j++) {
Node node2 = nodeList.item(j);
putNode(node2, saxHandler, i+1);
}
putNodeEndTag(tagNameString, node, saxHandler);
}
}
else {
putNodeStartTag(node, saxHandler);
NodeList nodeList = node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++) {
Node node2 = nodeList.item(i);
putNode(node2, saxHandler, no);
}
putNodeEndTag(node, saxHandler);
}
break;
}
}
private void putNodeTextTag(Node node, TransformerHandler saxHandler, int no) throws SAXException {
if(node.getNodeType() == Node.TEXT_NODE) {
String s = node.getNodeValue().trim();
String noString = Integer.toString(no);
s = s.replaceAll("%s", noString);
char charMsg = s.toCharArray();
saxHandler.characters(charMsg, 0, charMsg.length);
}
}
private void putNodeStartTag(Node node, TransformerHandler saxHandler) throws SAXException {
if(node.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap map = node.getAttributes();
String tagNameString = node.getNodeName();
AttributesImpl attributes = new AttributesImpl();
for(int i=0;i<map.getLength();i++) {
Node n = map.item(i);
attributes.addAttribute("", n.getNodeName(), n.getNodeName(), "CDATA", n.getNodeValue());
}
saxHandler.startElement("", tagNameString, tagNameString, attributes);
}
}
private void putNodeEndTag(Node node, TransformerHandler saxHandler) throws SAXException {
if(node.getNodeType() == Node.ELEMENT_NODE) {
String tagNameString = node.getNodeName();
saxHandler.endElement("", tagNameString, tagNameString);
}
}
private void putNodeEndTag(String tagName, Node node, TransformerHandler saxHandler) throws SAXException {
if(node.getNodeType() == Node.ELEMENT_NODE) {
saxHandler.endElement("", tagName, tagName);
}
}
private void putForNodeStartTag(Node node, TransformerHandler saxHandler) throws SAXException {
NamedNodeMap map = node.getAttributes();
String tagNameString = map.getNamedItem("tagName").getNodeValue();
AttributesImpl attributes = new AttributesImpl();
for(int i=0;i<map.getLength();i++) {
Node n = map.item(i);
if(!n.getNodeName().equals("num") && !n.getNodeName().equals("tagName")) {
attributes.addAttribute("", n.getNodeName(), n.getNodeName(), "CDATA", n.getNodeValue());
}
}
saxHandler.startElement("", tagNameString, tagNameString, attributes);
}
}
作成するデータの構造を指定するサンプルデータ(Test5.xml)
(forタグは属性tagNameの値の名前で属性numの数のタグを生成する。)
<?xml version="1.0" encoding="Shift_JIS" ?> <students> <for num="2" tagName="school" Country="Japan"> <name>SchoolName_%s</name> <for num="3" tagName="Student" department="engineering"> <id>StudentID_%s</id> <name>StudentName_%s</name> </for> </for> </students>
実行結果(result5.xml)
<?xml version="1.0" encoding="UTF-8"?> <students> <school Country="Japan"> <name>SchoolName_1</name> <Student department="engineering"> <id>StudentID_1</id> <name>StudentName_1</name> </Student> <Student department="engineering"> <id>StudentID_2</id> <name>StudentName_2</name> </Student> <Student department="engineering"> <id>StudentID_3</id> <name>StudentName_3</name> </Student> </school> <school Country="Japan"> <name>SchoolName_2</name> <Student department="engineering"> <id>StudentID_1</id> <name>StudentName_1</name> </Student> <Student department="engineering"> <id>StudentID_2</id> <name>StudentName_2</name> </Student> <Student department="engineering"> <id>StudentID_3</id> <name>StudentName_3</name> </Student> </school> </students>
ここを参照しました。