📄 xmlwriter.java
字号:
/*
* Filter a end entity event.
*
* Pass the event on down the filter chain for further processing.
*
* @param name The name of the entity that is ending.
* @exception org.xml.sax.SAXException If a filter
* further down the chain raises an exception.
* @see org.xml.sax.ext.LexicalHandler#endEntity
*/
public void endEntity(String name)
throws SAXException {
super.endEntity(name);
}
/*
* Write start of CDATA.
*
* Pass the event on down the filter chain for further processing.
*
* @exception org.xml.sax.SAXException If a filter
* further down the chain raises an exception.
* @see org.xml.sax.ext.LexicalHandler#startCDATA
*/
public void startCDATA()
throws SAXException {
closeElement();
write("<![CDATA[");
super.startCDATA();
}
/*
* Write end of CDATA.
*
* Pass the event on down the filter chain for further processing.
*
* @exception org.xml.sax.SAXException If a filter
* further down the chain raises an exception.
* @see org.xml.sax.ext.LexicalHandler#endCDATA
*/
public void endCDATA()
throws SAXException {
write("]]>");
super.endCDATA();
}
/*
* Write a comment.
*
* Pass the event on down the filter chain for further processing.
*
* @param ch An array holding the characters in the comment.
* @param start The starting position in the array.
* @param length The number of characters to use from the array.
* @exception org.xml.sax.SAXException If a filter
* further down the chain raises an exception.
* @see org.xml.sax.ext.LexicalHandler#comment
*/
public void comment(char[] ch, int start, int length)
throws SAXException {
if (!inDTD) {
closeElement();
write("<!--");
write(ch, start, length);
write("-->");
if (elementLevel < 1) {
write('\n');
}
}
super.comment(ch, start, length);
}
////////////////////////////////////////////////////////////////////
// Internal methods.
////////////////////////////////////////////////////////////////////
/**
* Force all Namespaces to be declared.
*
* This method is used on the root element to ensure that
* the predeclared Namespaces all appear.
*/
private void forceNSDecls ()
{
Iterator prefixes = forcedDeclTable.keySet().iterator();
while (prefixes.hasNext()) {
String prefix = (String)prefixes.next();
doPrefix(prefix, null, true);
}
}
/**
* Determine the prefix for an element or attribute name.
*
* TODO: this method probably needs some cleanup.
*
* @param uri The Namespace URI.
* @param qName The qualified name (optional); this will be used
* to indicate the preferred prefix if none is currently
* bound.
* @param isElement true if this is an element name, false
* if it is an attribute name (which cannot use the
* default Namespace).
*/
private String doPrefix (String uri, String qName, boolean isElement)
{
String defaultNS = nsSupport.getURI("");
if ("".equals(uri)) {
if (isElement && defaultNS != null)
nsSupport.declarePrefix("", "");
return null;
}
String prefix;
if (isElement && defaultNS != null && uri.equals(defaultNS)) {
prefix = "";
} else {
prefix = nsSupport.getPrefix(uri);
}
if (prefix != null) {
return prefix;
}
prefix = (String) doneDeclTable.get(uri);
if (prefix != null &&
((!isElement || defaultNS != null) &&
"".equals(prefix) || nsSupport.getURI(prefix) != null)) {
prefix = null;
}
if (prefix == null) {
prefix = (String) prefixTable.get(uri);
if (prefix != null &&
((!isElement || defaultNS != null) &&
"".equals(prefix) || nsSupport.getURI(prefix) != null)) {
prefix = null;
}
}
if (prefix == null && qName != null && !"".equals(qName)) {
int i = qName.indexOf(':');
if (i == -1) {
if (isElement && defaultNS == null) {
prefix = "";
}
} else {
prefix = qName.substring(0, i);
}
}
for (;
prefix == null || nsSupport.getURI(prefix) != null;
prefix = "__NS" + ++prefixCounter)
;
nsSupport.declarePrefix(prefix, uri);
doneDeclTable.put(uri, prefix);
return prefix;
}
/**
* Write a raw character.
*
* @param c The character to write.
* @exception org.xml.sax.SAXException If there is an error writing
* the character, this method will throw an IOException
* wrapped in a SAXException.
*/
private void write (char c)
throws SAXException
{
try {
output.write(c);
} catch (IOException e) {
throw new SAXException(e);
}
}
/**
* Write a portion of an array of characters.
*
* @param cbuf Array of characters.
* @param off Offset from which to start writing characters.
* @param len Number of characters to write.
* @exception org.xml.sax.SAXException If there is an error writing
* the character, this method will throw an IOException
* wrapped in a SAXException.
*/
private void write (char[] cbuf, int off, int len)
throws SAXException
{
try {
output.write(cbuf, off, len);
} catch (IOException e) {
throw new SAXException(e);
}
}
/**
* Write a raw string.
*
* @param s
* @exception org.xml.sax.SAXException If there is an error writing
* the string, this method will throw an IOException
* wrapped in a SAXException
*/
private void write (String s)
throws SAXException
{
try {
output.write(s);
} catch (IOException e) {
throw new SAXException(e);
}
}
/**
* Write out an attribute list, escaping values.
*
* The names will have prefixes added to them.
*
* @param atts The attribute list to write.
* @exception org.xml.SAXException If there is an error writing
* the attribute list, this method will throw an
* IOException wrapped in a SAXException.
*/
private void writeAttributes (Attributes atts)
throws SAXException
{
int len = atts.getLength();
for (int i = 0; i < len; i++) {
char ch[] = atts.getValue(i).toCharArray();
write(' ');
writeName(atts.getURI(i), atts.getLocalName(i),
atts.getQName(i), false);
write("=\"");
writeEsc(ch, 0, ch.length, true);
write('"');
}
}
/**
* Write an array of data characters with escaping.
*
* @param ch The array of characters.
* @param start The starting position.
* @param length The number of characters to use.
* @param isAttVal true if this is an attribute value literal.
* @exception org.xml.SAXException If there is an error writing
* the characters, this method will throw an
* IOException wrapped in a SAXException.
*/
private void writeEsc (char ch[], int start,
int length, boolean isAttVal)
throws SAXException
{
for (int i = start; i < start + length; i++) {
switch (ch[i]) {
case '&':
write("&");
break;
case '<':
write("<");
break;
case '>':
write(">");
break;
case '\"':
if (isAttVal) {
write(""");
} else {
write('\"');
}
break;
default:
if (ch[i] > '\u007f') {
write("&#");
write(Integer.toString(ch[i]));
write(';');
} else {
write(ch[i]);
}
}
}
}
/**
* Write out the list of Namespace declarations.
*
* @exception org.xml.sax.SAXException This method will throw
* an IOException wrapped in a SAXException if
* there is an error writing the Namespace
* declarations.
*/
private void writeNSDecls ()
throws SAXException
{
Enumeration prefixes = nsSupport.getDeclaredPrefixes();
while (prefixes.hasMoreElements()) {
String prefix = (String) prefixes.nextElement();
String uri = nsSupport.getURI(prefix);
if (uri == null) {
uri = "";
}
char ch[] = uri.toCharArray();
write(' ');
if ("".equals(prefix)) {
write("xmlns=\"");
} else {
write("xmlns:");
write(prefix);
write("=\"");
}
writeEsc(ch, 0, ch.length, true);
write('\"');
}
}
/**
* Write an element or attribute name.
*
* @param uri The Namespace URI.
* @param localName The local name.
* @param qName The prefixed name, if available, or the empty string.
* @param isElement true if this is an element name, false if it
* is an attribute name.
* @exception org.xml.sax.SAXException This method will throw an
* IOException wrapped in a SAXException if there is
* an error writing the name.
*/
private void writeName (String uri, String localName,
String qName, boolean isElement)
throws SAXException
{
String prefix = doPrefix(uri, qName, isElement);
if (prefix != null && !"".equals(prefix)) {
write(prefix);
write(':');
}
write(localName);
}
/**
* If start element tag is still open, write closing bracket.
*/
private void closeElement()
throws SAXException
{
if (openElement) {
write('>');
openElement = false;
}
}
////////////////////////////////////////////////////////////////////
// Internal state.
////////////////////////////////////////////////////////////////////
private Map prefixTable;
private Map forcedDeclTable;
private Map doneDeclTable;
private boolean openElement = false;
private int elementLevel = 0;
private Writer output;
private NamespaceSupport nsSupport;
private int prefixCounter = 0;
private boolean inDTD = false;
}
// end of XMLWriter.java
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -