saxwriter.java
来自「数据仓库展示程序」· Java 代码 · 共 168 行
JAVA
168 行
/*
// $Id: //open/mondrian/src/main/mondrian/util/SAXWriter.java#6 $
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// Copyright (C) 2003-2005 Julian Hyde
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package mondrian.util;
import org.eigenbase.xom.XMLUtil;
import org.eigenbase.xom.XOMUtil;
import org.xml.sax.*;
import java.io.*;
/**
* <code>SAXWriter</code> is a SAX {@link org.xml.sax.ContentHandler}
* which, perversely, converts its events into an output document.
*
* @author jhyde
* @since 27 April, 2003
* @version $Id: //open/mondrian/src/main/mondrian/util/SAXWriter.java#6 $
*/
public class SAXWriter implements ContentHandler {
private final PrintWriter pw;
private int indent;
private String indentString = " ";
private int state = STATE_END_ELEMENT;
/** Inside the tag of an element. */
private static final int STATE_IN_TAG = 0;
/** After the tag at the end of an element. */
private static final int STATE_END_ELEMENT = 1;
/** After the tag at the start of an element. */
private static final int STATE_AFTER_TAG = 2;
/** After a burst of character data. */
private static final int STATE_CHARACTERS = 3;
/**
* Creates a <code>SAXWriter</code> writing to an {@link OutputStream}.
*/
public SAXWriter(OutputStream stream) {
this.pw = new PrintWriter(new OutputStreamWriter(stream));
}
/**
* Creates a <code>SAXWriter</code> writing to a {@link Writer}.
*
* <p>If <code>writer</code> is a {@link PrintWriter},
* {@link #SAXWriter(PrintWriter)} is preferred.
*/
public SAXWriter(Writer writer) {
this.pw = new PrintWriter(writer);
}
/**
* Creates a <code>SAXWriter</code> writing to a {@link PrintWriter}.
* @param writer
*/
public SAXWriter(PrintWriter writer) {
this.pw = writer;
}
public void setDocumentLocator(Locator locator) {
}
public void startDocument()
throws SAXException {
pw.println("<?xml version=\"1.0\"?>");
}
public void endDocument()
throws SAXException {
this.pw.flush();
}
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
}
public void endPrefixMapping(String prefix)
throws SAXException {
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts)
throws SAXException {
checkTag();
if (indent > 0) {
pw.println();
}
for (int i = 0; i < indent; i++) {
pw.write(indentString);
}
indent++;
pw.write('<');
pw.write(qName);
for (int i = 0; i < atts.getLength(); i++) {
XMLUtil.printAtt(pw, atts.getQName(i), atts.getValue(i));
}
state = STATE_IN_TAG;
}
private void checkTag() {
if (state == STATE_IN_TAG) {
state = STATE_AFTER_TAG;
pw.print(">");
}
}
public void endElement(String namespaceURI, String localName,
String qName)
throws SAXException {
indent--;
if (state == STATE_IN_TAG) {
pw.write("/>");
} else {
if (state != STATE_CHARACTERS) {
pw.println();
for (int i = 0; i < indent; i++) {
pw.write(indentString);
}
}
pw.write("</");
pw.write(qName);
pw.write('>');
}
state = STATE_END_ELEMENT;
}
public void characters(char ch[], int start, int length)
throws SAXException {
checkTag();
// Display the string, quoting in <![CDATA[ ... ]]> if necessary,
// or using XML escapes as a last result.
String s = new String(ch, start, length);
if (XOMUtil.stringHasXMLSpecials(s)) {
if (s.indexOf("]]>") < 0) {
pw.print("<![CDATA[");
pw.print(s);
pw.print("]]>");
} else {
XMLUtil.stringEncodeXML(s, pw);
}
} else {
pw.print(s);
}
state = STATE_CHARACTERS;
}
public void ignorableWhitespace(char ch[], int start, int length)
throws SAXException {
}
public void processingInstruction(String target, String data)
throws SAXException {
}
public void skippedEntity(String name)
throws SAXException {
}
}
// End SAXWriter.java
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?