xuxiuxi
2017-07-22 4bee2fa9f76f7e200bf1bf01c24b709d16a58488
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
package com.awsle.aibatis.xml.engine.xml.text;
 
import com.awsle.aibatis.xml.engine.xml.XMLWriter;
 
import java.io.PrintWriter;
import java.io.Writer;
import java.util.LinkedList;
 
public class PrettyPrintXMLWriter implements XMLWriter {
 
    private PrintWriter writer;
    private LinkedList elementStack = new LinkedList();
    private boolean tagInProgress;
    private int depth;
    private String lineIndenter;
    private boolean readyForNewLine;
    private boolean tagIsEmpty;
 
    public PrettyPrintXMLWriter(PrintWriter writer, String lineIndenter) {
        this.writer = writer;
        this.lineIndenter = lineIndenter;
    }
 
    public PrettyPrintXMLWriter(Writer writer, String lineIndenter) {
        this(new PrintWriter(writer), lineIndenter);
    }
 
    public PrettyPrintXMLWriter(PrintWriter writer) {
        this(writer, "  ");
    }
 
    public PrettyPrintXMLWriter(Writer writer) {
        this(new PrintWriter(writer));
    }
 
    public void startElement(String name) {
        tagIsEmpty = false;
        finishTag();
        write("<");
        write(name);
        elementStack.addLast(name);
        tagInProgress = true;
        depth++;
        readyForNewLine = true;
        tagIsEmpty = true;
    }
 
    public void writeText(String text) {
        readyForNewLine = false;
        tagIsEmpty = false;
        finishTag();
        text = text.replaceAll("&", "&amp;");
        text = text.replaceAll("<", "&lt;");
        text = text.replaceAll(">", "&gt;");
        write(text);
    }
 
    public void addAttribute(String key, String value) {
        write(" ");
        write(key);
        write("=\"");
        write(value);
        write("\"");
    }
 
    public void endElement() {
        depth--;
        if (tagIsEmpty) {
            write("/");
            readyForNewLine = false;
            finishTag();
            elementStack.removeLast();
        } else {
            finishTag();
            write("</" + elementStack.removeLast() + ">");
        }
        readyForNewLine = true;
    }
 
    private void write(String str) {
        writer.write(str);
    }
 
    private void finishTag() {
        if (tagInProgress) {
            write(">");
        }
        tagInProgress = false;
        if (readyForNewLine) {
            endOfLine();
        }
        readyForNewLine = false;
        tagIsEmpty = false;
    }
 
    protected void endOfLine() {
        write("\n");
        for (int i = 0; i < depth; i++) {
            write(lineIndenter);
        }
    }
}