-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInputParser.java
More file actions
137 lines (130 loc) · 3.76 KB
/
Copy pathInputParser.java
File metadata and controls
137 lines (130 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import java.io.*;
import java.util.Vector;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class InputParser {
public static void main(String args[]) {
if (args.length>=1) {
File f=new File(args[0]);
if (f.exists() && f.isFile()) {
InputParser ip=new InputParser();
ip.process(f);
} else {
System.err.println("Need a valid input file");
}
} else {
System.err.println("Need an input file");
}
}
private Document xmlDoc;
private XPath xPath;
public InputParser() {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
xmlDoc = docBuilder.newDocument();
XPathFactory xPathfactory = XPathFactory.newInstance();
xPath = xPathfactory.newXPath();
} catch (Exception err ) {
err.printStackTrace();
}
}
public void process(File f) {
/*
* Holding place for incoming elements
*/
Vector<DataElement> dataElemList=new Vector<DataElement>();
try {
String line=null;
/*
* Read from input file
*/
BufferedReader read=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
while((line=read.readLine())!=null) {
String parts[] = line.split("\\|");
for (String part:parts) {
DataElement de=new DataElement(part);
dataElemList.add(de);
}
}
read.close();
} catch (IOException err) {
err.printStackTrace();
}
/*
* Verify we have the data pre-loaded
*/
for (DataElement de:dataElemList) {
System.out.println(de);
}
/*
* Load data into an XML Document.
*/
for (DataElement de:dataElemList) {
/*
* Create XML Element to append to XML Document
*/
Element elem = xmlDoc.createElement("DataElem");
elem.setAttribute("node_id", de.node_id);
elem.setAttribute("node_name", de.node_name);
if ("null".equals(de.parent_id)) {
xmlDoc.appendChild(elem);
} else {
try {
XPathExpression expr = xPath.compile(String.format("//DataElem[@node_id=\"%s\"]/self::node()",de.parent_id));
Element lookup = (Element)expr.evaluate(xmlDoc, XPathConstants.NODE);
lookup.appendChild(elem);
} catch (Exception err) {
err.printStackTrace();
}
}
}
System.out.println();
/*
* XML Document populated, dump to System.out
*/
try {
TransformerFactory tfactory = TransformerFactory.newInstance();
tfactory.setAttribute("indent-number",new Integer(3));
Transformer xtransform = tfactory.newTransformer();
xtransform.setOutputProperty(OutputKeys.INDENT,"yes");
xtransform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
Source src = new DOMSource(xmlDoc);
Result res = new StreamResult(new OutputStreamWriter(System.out, "utf-8"));
xtransform.transform(src, res);
} catch(Exception err) {
err.printStackTrace();
}
}
private class DataElement {
public String parent_id;
public String node_id;
public String node_name;
public DataElement(String part) {
String bits[]=part.split(",");
if (bits.length==3) {
parent_id=bits[0];
node_id=bits[1];
node_name=bits[2];
}
}
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append(parent_id).append(',').append(node_id).append(',').append(node_name);
return sb.toString();
}
}
}