[go: up one dir, main page]

Menu

[r85]: / trunk / XmlConverter.java  Maximize  Restore  History

Download this file

130 lines (122 with data), 3.4 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
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.swing.JFileChooser;
public class XmlConverter {
public boolean anyConversion = false;
public String convertXml(Reader reader) throws IOException {
// TODO: bug: code only works for Basic Multilingual Plane
anyConversion = false;
StringBuilder out = new StringBuilder();
int ch;
while ((ch = reader.read()) != -1) {
process((char)ch, out);
}
if (ampersand) {
ampersand = false;
out.append("&");
anyConversion = true;
}
String result = out.toString();
if (!result.startsWith("<?")) {
// Output is UTF-8 encoding
result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + result;
anyConversion = true;
}
return result;
}
private boolean ampersand = false;
private void process(char codePoint, StringBuilder out) {
if (ampersand) {
ampersand = false;
if (codePoint == '#' ||
(codePoint >= 'a' && codePoint <= 'z') ||
(codePoint >= 'A' && codePoint <= 'Z')) {
out.append('&');
}
else {
anyConversion = true;
out.append("&amp;");
}
}
switch (codePoint) {
case '&':
// Delay processing until we see the next char
ampersand = true;
break;
/*
case '"':
out.append("&quot;");
break;
case '\'':
out.append("&apos;");
anyConversion = true;
break;
*/
/*
case '<':
out.append("&lt;");
anyConversion = true;
break;
case '>':
out.append("&gt;");
anyConversion = true;
break;
*/
default:
if (codePoint > 127) {
// Special character - encode as number
out.append("&#");
out.append(Integer.toString(codePoint));
out.append(";");
anyConversion = true;
}
else
out.append(codePoint);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Safe XML Converter");
chooser.setMultiSelectionEnabled(true);
if (chooser.showDialog(null, "Convert") == JFileChooser.APPROVE_OPTION) {
File[] files = chooser.getSelectedFiles();
for (int f = 0; f < files.length; f++) {
try {
Reader read = new InputStreamReader(new FileInputStream(files[f]));
// InputStreamReader constructor could take charset name
// as additional parameter - but we're using default
read = new BufferedReader(read);
XmlConverter converter = new XmlConverter();
String converted = converter.convertXml(read);
read.close();
if (converter.anyConversion) {
if (files[f].delete()) {
FileWriter write = new FileWriter(files[f]);
write.write(converted);
write.close();
System.out.println(files[f] + ": successfully converted");
}
else {
System.err.println(files[f] + ": couldn't delete old file");
}
}
else {
System.out.println(files[f] + ": no conversion required");
}
}
catch (IOException ioe) {
System.err.println(files[f] + ": " + ioe);
}
}
}
}
}