Flesh out XML read and write utility methods

This commit is contained in:
drdev
2014-05-09 04:06:31 +00:00
parent b100812ed0
commit 97c5354889
2 changed files with 152 additions and 5 deletions

View File

@@ -51,5 +51,11 @@
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
<dependency>
<groupId>xmlpull</groupId>
<artifactId>xmlpull</artifactId>
<version>1.1.3.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@@ -18,6 +18,9 @@
package forge.util;
import org.w3c.dom.Node;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
@@ -25,12 +28,18 @@ import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
/**
* TODO: Write javadoc for this type.
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Stack;
public class XmlUtil {
/**
@@ -51,4 +60,136 @@ public class XmlUtil {
}
return sw.toString();
}
public static void read(String filename, XmlTagReader reader) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xml = factory.newPullParser();
xml.setInput(new InputStreamReader(new FileInputStream(filename)));
int eventType = xml.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
reader.tagStart(xml);
break;
case XmlPullParser.END_TAG:
reader.tagEnd(xml);
break;
}
eventType = xml.next();
}
}
catch (final FileNotFoundException e) {
/* ignore if file doesn't exist */
}
catch (Exception e) {
e.printStackTrace();
}
}
public static abstract class XmlTagReader {
public abstract void tagStart(XmlPullParser xml);
public void tagEnd(XmlPullParser xml) {
//not required to override but can be
}
}
public static void write(String filename, XmlTagWriter writer) {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(filename);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(System.getProperty(XmlPullParserFactory.PROPERTY_NAME), null);
XmlSerializer xml = factory.newSerializer();
xml.setOutput(outputStream, null);
xml.startDocument(null, true);
xml.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
writer.writeTags(new XmlWriter(xml));
xml.endDocument();
xml.flush();
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
if (outputStream != null) {
try {
outputStream.close();
}
catch (Exception e1) {
e1.printStackTrace();
}
}
try {
new File(filename).delete(); //delete file if exception
}
catch (Exception e1) {
e1.printStackTrace();
}
}
}
public static class XmlWriter {
private XmlSerializer xml;
private Stack<String> tagnames;
private XmlWriter(XmlSerializer xml0) {
xml = xml0;
}
public void startTag(String tagname) {
startTag(tagname, null);
}
public void startTag(String tagname, Map<String, String> attrs) {
try {
xml.startTag("", tagname);
if (attrs != null) {
for (Entry<String, String> attr : attrs.entrySet()) {
xml.attribute("", attr.getKey(), attr.getValue());
}
}
tagnames.push(tagname);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void writeTag(String tagname, Map<String, String> attrs) {
writeTag(tagname, attrs, null);
}
public void writeTag(String tagname, String value) {
writeTag(tagname, null, value);
}
public void writeTag(String tagname, Map<String, String> attrs, String value) {
try {
xml.startTag("", tagname);
if (attrs != null) {
for (Entry<String, String> attr : attrs.entrySet()) {
xml.attribute("", attr.getKey(), attr.getValue());
}
}
if (value != null) {
xml.text(value);
}
xml.endTag("", tagname);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void endTag() {
try {
xml.endTag("", tagnames.pop());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public static abstract class XmlTagWriter {
public abstract void writeTags(XmlWriter xml);
}
}