1 |
|
package yarfraw.utils; |
2 |
|
|
3 |
|
|
4 |
|
import java.io.File; |
5 |
|
import java.io.FileWriter; |
6 |
|
import java.io.IOException; |
7 |
|
import java.io.OutputStream; |
8 |
|
import java.io.OutputStreamWriter; |
9 |
|
import java.io.Writer; |
10 |
|
|
11 |
|
|
12 |
|
import org.w3c.dom.Document; |
13 |
|
import org.w3c.dom.DocumentType; |
14 |
|
import org.w3c.dom.NamedNodeMap; |
15 |
|
import org.w3c.dom.Node; |
16 |
|
import org.w3c.dom.NodeList; |
17 |
|
|
18 |
6 |
public class DOMSerializer { |
19 |
|
|
20 |
|
|
21 |
6 |
private String indent = ""; |
22 |
|
|
23 |
|
|
24 |
6 |
private String lineSeparator = "\n"; |
25 |
|
|
26 |
|
|
27 |
6 |
private String encoding = "UTF8"; |
28 |
|
|
29 |
|
public void setLineSeparator(String lineSeparator) { |
30 |
0 |
this.lineSeparator = lineSeparator; |
31 |
0 |
} |
32 |
|
|
33 |
|
public void setEncoding(String encoding) { |
34 |
0 |
this.encoding = encoding; |
35 |
0 |
} |
36 |
|
|
37 |
|
public void setIndent(int numSpaces) { |
38 |
0 |
StringBuffer buffer = new StringBuffer(); |
39 |
0 |
for (int i = 0; i < numSpaces; i++) |
40 |
0 |
buffer.append(" "); |
41 |
0 |
this.indent = buffer.toString(); |
42 |
0 |
} |
43 |
|
|
44 |
|
public void serialize(Document doc, OutputStream out) throws IOException { |
45 |
0 |
Writer writer = new OutputStreamWriter(out, encoding); |
46 |
0 |
serialize(doc, writer); |
47 |
0 |
} |
48 |
|
|
49 |
|
public void serialize(Document doc, File file) throws IOException { |
50 |
0 |
Writer writer = new FileWriter(file); |
51 |
0 |
serialize(doc, writer); |
52 |
0 |
} |
53 |
|
|
54 |
|
public void serialize(Document doc, Writer writer) throws IOException { |
55 |
|
|
56 |
3 |
serializeNode(doc, writer, ""); |
57 |
3 |
writer.flush(); |
58 |
3 |
} |
59 |
|
|
60 |
|
public void serializeNode(Node node, Writer writer, String indentLevel) |
61 |
|
throws IOException { |
62 |
|
|
63 |
117 |
switch (node.getNodeType()) { |
64 |
|
case Node.DOCUMENT_NODE: |
65 |
3 |
Document doc = (Document) node; |
66 |
|
|
67 |
|
|
68 |
|
|
69 |
|
|
70 |
3 |
writer.write("<?xml version=\""); |
71 |
3 |
writer.write(doc.getXmlVersion()); |
72 |
3 |
writer.write("\" encoding=\"UTF-8\" standalone=\""); |
73 |
3 |
if (doc.getXmlStandalone()) |
74 |
0 |
writer.write("yes"); |
75 |
|
else |
76 |
3 |
writer.write("no"); |
77 |
3 |
writer.write("\""); |
78 |
3 |
writer.write("?>"); |
79 |
3 |
writer.write(lineSeparator); |
80 |
|
|
81 |
|
|
82 |
3 |
NodeList nodes = node.getChildNodes(); |
83 |
3 |
if (nodes != null) |
84 |
6 |
for (int i = 0; i < nodes.getLength(); i++) |
85 |
3 |
serializeNode(nodes.item(i), writer, ""); |
86 |
|
break; |
87 |
|
case Node.ELEMENT_NODE: |
88 |
63 |
String name = node.getNodeName(); |
89 |
63 |
writer.write(indentLevel + "<" + name); |
90 |
63 |
NamedNodeMap attributes = node.getAttributes(); |
91 |
87 |
for (int i = 0; i < attributes.getLength(); i++) { |
92 |
24 |
Node current = attributes.item(i); |
93 |
24 |
writer.write(" " + current.getNodeName() + "=\""); |
94 |
24 |
print(writer, current.getNodeValue()); |
95 |
24 |
writer.write("\""); |
96 |
|
} |
97 |
63 |
writer.write(">"); |
98 |
|
|
99 |
|
|
100 |
63 |
NodeList children = node.getChildNodes(); |
101 |
63 |
if (children != null) { |
102 |
63 |
if ((children.item(0) != null) |
103 |
|
&& (children.item(0).getNodeType() == Node.ELEMENT_NODE)) |
104 |
12 |
writer.write(lineSeparator); |
105 |
|
|
106 |
168 |
for (int i = 0; i < children.getLength(); i++) |
107 |
105 |
serializeNode(children.item(i), writer, indentLevel |
108 |
|
+ indent); |
109 |
|
|
110 |
63 |
if ((children.item(0) != null) |
111 |
|
&& (children.item(children.getLength() - 1) |
112 |
|
.getNodeType() == Node.ELEMENT_NODE)) |
113 |
12 |
writer.write(indentLevel); |
114 |
|
} |
115 |
|
|
116 |
63 |
writer.write("</" + name + ">"); |
117 |
63 |
writer.write(lineSeparator); |
118 |
63 |
break; |
119 |
|
case Node.TEXT_NODE: |
120 |
51 |
print(writer, node.getNodeValue()); |
121 |
51 |
break; |
122 |
|
case Node.CDATA_SECTION_NODE: |
123 |
0 |
writer.write("<![CDATA["); |
124 |
0 |
print(writer, node.getNodeValue()); |
125 |
0 |
writer.write("]]>"); |
126 |
0 |
break; |
127 |
|
case Node.COMMENT_NODE: |
128 |
0 |
writer.write(indentLevel + "<!-- " + node.getNodeValue() + " -->"); |
129 |
0 |
writer.write(lineSeparator); |
130 |
0 |
break; |
131 |
|
case Node.PROCESSING_INSTRUCTION_NODE: |
132 |
0 |
writer.write("<?" + node.getNodeName() + " " + node.getNodeValue() |
133 |
|
+ "?>"); |
134 |
0 |
writer.write(lineSeparator); |
135 |
0 |
break; |
136 |
|
case Node.ENTITY_REFERENCE_NODE: |
137 |
0 |
writer.write("&" + node.getNodeName( ) + ";"); |
138 |
0 |
break; |
139 |
|
case Node.DOCUMENT_TYPE_NODE: |
140 |
0 |
DocumentType docType = (DocumentType) node; |
141 |
0 |
String publicId = docType.getPublicId(); |
142 |
0 |
String systemId = docType.getSystemId(); |
143 |
0 |
String internalSubset = docType.getInternalSubset(); |
144 |
0 |
writer.write("<!DOCTYPE " + docType.getName()); |
145 |
0 |
if (publicId != null) |
146 |
0 |
writer.write(" PUBLIC \"" + publicId + "\" "); |
147 |
|
else |
148 |
0 |
writer.write(" SYSTEM "); |
149 |
0 |
writer.write("\"" + systemId + "\""); |
150 |
0 |
if (internalSubset != null) |
151 |
0 |
writer.write(" [" + internalSubset + "]"); |
152 |
0 |
writer.write(">"); |
153 |
0 |
writer.write(lineSeparator); |
154 |
|
break; |
155 |
|
} |
156 |
117 |
} |
157 |
|
|
158 |
|
private void print(Writer writer, String s) throws IOException { |
159 |
|
|
160 |
75 |
if (s == null) |
161 |
0 |
return; |
162 |
16221 |
for (int i = 0, len = s.length(); i < len; i++) { |
163 |
16146 |
char c = s.charAt(i); |
164 |
16146 |
switch (c) { |
165 |
|
case '<': |
166 |
0 |
writer.write("<"); |
167 |
0 |
break; |
168 |
|
case '>': |
169 |
0 |
writer.write(">"); |
170 |
0 |
break; |
171 |
|
case '&': |
172 |
0 |
writer.write("&"); |
173 |
0 |
break; |
174 |
|
case '\r': |
175 |
0 |
writer.write("
"); |
176 |
0 |
break; |
177 |
|
default: |
178 |
16146 |
writer.write(c); |
179 |
|
} |
180 |
|
} |
181 |
75 |
} |
182 |
|
|
183 |
|
} |
184 |
|
|
185 |
|
|
186 |
|
|
187 |
|
|
188 |
|
|
189 |
|
|
190 |
|
|
191 |
|
|