📄 jdomresult.java
字号:
* This is needed to handle XML comments and the like. If the
* lexical handler is not set, an attempt should be made by the
* transformer to cast the ContentHandler to a LexicalHandler.</p>
*
* @param handler A non-null LexicalHandler for
* handling lexical parse events.
*/
public void setLexicalHandler(LexicalHandler handler) { }
//=========================================================================
// FragmentHandler nested class
//=========================================================================
private static class FragmentHandler extends SAXHandler {
/**
* A dummy root element required by SAXHandler that can only
* cope with well-formed documents.
*/
private Element dummyRoot = new Element("root", null, null);
/**
* Public constructor.
*/
public FragmentHandler(JDOMFactory factory) {
super(factory);
// Add a dummy root element to the being-built document as XSL
// transformation can output node lists instead of well-formed
// documents.
this.pushElement(dummyRoot);
}
/**
* Returns the result of an XSL Transformation.
*
* @return the transformation result as a (possibly empty) list of
* JDOM nodes (Elements, Texts, Comments, PIs...).
*/
public List getResult() {
// Flush remaining text content in case the last text segment is
// outside an element.
try {
this.flushCharacters();
}
catch (SAXException e) { /* Ignore... */ }
return this.getDetachedContent(dummyRoot);
}
/**
* Returns the content of a JDOM Element detached from it.
*
* @param elt the element to get the content from.
*
* @return a (possibly empty) list of JDOM nodes, detached from
* their parent.
*/
private List getDetachedContent(Element elt) {
List content = elt.getContent();
List nodes = new ArrayList(content.size());
while (content.size() != 0)
{
Object o = content.remove(0);
nodes.add(o);
}
return (nodes);
}
}
//=========================================================================
// DocumentBuilder inner class
//=========================================================================
private class DocumentBuilder extends XMLFilterImpl
implements LexicalHandler {
/**
* The actual JDOM document builder.
*/
private FragmentHandler saxHandler = null;
/**
* Whether the startDocument event was received. Some XSLT
* processors such as Oracle's do not fire this event.
*/
private boolean startDocumentReceived = false;
/**
* Public default constructor.
*/
public DocumentBuilder() { }
/**
* Returns the result of an XSL Transformation.
*
* @return the transformation result as a (possibly empty) list of
* JDOM nodes (Elements, Texts, Comments, PIs...) or
* <code>null</code> if no new transformation occurred
* since the result of the previous one was returned.
*/
public List getResult() {
List result = null;
if (this.saxHandler != null) {
// Retrieve result from SAX content handler.
result = this.saxHandler.getResult();
// Detach the (non-reusable) SAXHandler instance.
this.saxHandler = null;
// And get ready for the next transformation.
this.startDocumentReceived = false;
}
return result;
}
private void ensureInitialization() throws SAXException {
// Trigger document initialization if XSLT processor failed to
// fire the startDocument event.
if (this.startDocumentReceived == false) {
this.startDocument();
}
}
//-----------------------------------------------------------------------
// XMLFilterImpl overwritten methods
//-----------------------------------------------------------------------
/**
* <i>[SAX ContentHandler interface support]</i> Processes a
* start of document event.
* <p>
* This implementation creates a new JDOM document builder and
* marks the current result as "under construction".</p>
*
* @throws SAXException if any error occurred while creating
* the document builder.
*/
public void startDocument() throws SAXException {
this.startDocumentReceived = true;
// Reset any previously set result.
setResult(null);
// Create the actual JDOM document builder and register it as
// ContentHandler on the superclass (XMLFilterImpl): this
// implementation will take care of propagating the LexicalHandler
// events.
this.saxHandler = new FragmentHandler(getFactory());
super.setContentHandler(this.saxHandler);
// And propagate event.
super.startDocument();
}
/**
* <i>[SAX ContentHandler interface support]</i> Receives
* notification of the beginning of an element.
* <p>
* This implementation ensures that startDocument() has been
* called prior processing an element.
*
* @param nsURI the Namespace URI, or the empty string if
* the element has no Namespace URI or if
* Namespace processing is not being performed.
* @param localName the local name (without prefix), or the
* empty string if Namespace processing is
* not being performed.
* @param qName the qualified name (with prefix), or the
* empty string if qualified names are not
* available.
* @param atts The attributes attached to the element. If
* there are no attributes, it shall be an
* empty Attributes object.
*
* @throws SAXException if any error occurred while creating
* the document builder.
*/
public void startElement(String nsURI, String localName, String qName,
Attributes atts) throws SAXException
{
this.ensureInitialization();
super.startElement(nsURI, localName, qName, atts);
}
/**
* <i>[SAX ContentHandler interface support]</i> Begins the
* scope of a prefix-URI Namespace mapping.
*/
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
this.ensureInitialization();
super.startPrefixMapping(prefix, uri);
}
/**
* <i>[SAX ContentHandler interface support]</i> Receives
* notification of character data.
*/
public void characters(char ch[], int start, int length)
throws SAXException {
this.ensureInitialization();
super.characters(ch, start, length);
}
/**
* <i>[SAX ContentHandler interface support]</i> Receives
* notification of ignorable whitespace in element content.
*/
public void ignorableWhitespace(char ch[], int start, int length)
throws SAXException {
this.ensureInitialization();
super.ignorableWhitespace(ch, start, length);
}
/**
* <i>[SAX ContentHandler interface support]</i> Receives
* notification of a processing instruction.
*/
public void processingInstruction(String target, String data)
throws SAXException {
this.ensureInitialization();
super.processingInstruction(target, data);
}
/**
* <i>[SAX ContentHandler interface support]</i> Receives
* notification of a skipped entity.
*/
public void skippedEntity(String name) throws SAXException {
this.ensureInitialization();
super.skippedEntity(name);
}
//-----------------------------------------------------------------------
// LexicalHandler interface support
//-----------------------------------------------------------------------
/**
* <i>[SAX LexicalHandler interface support]</i> Reports the
* start of DTD declarations, if any.
*
* @param name the document type name.
* @param publicId the declared public identifier for the
* external DTD subset, or <code>null</code>
* if none was declared.
* @param systemId the declared system identifier for the
* external DTD subset, or <code>null</code>
* if none was declared.
*
* @throws SAXException The application may raise an exception.
*/
public void startDTD(String name, String publicId, String systemId)
throws SAXException {
this.ensureInitialization();
this.saxHandler.startDTD(name, publicId, systemId);
}
/**
* <i>[SAX LexicalHandler interface support]</i> Reports the end
* of DTD declarations.
*
* @throws SAXException The application may raise an exception.
*/
public void endDTD() throws SAXException {
this.saxHandler.endDTD();
}
/**
* <i>[SAX LexicalHandler interface support]</i> Reports the
* beginning of some internal and external XML entities.
*
* @param name the name of the entity. If it is a parameter
* entity, the name will begin with '%', and if it
* is the external DTD subset, it will be "[dtd]".
*
* @throws SAXException The application may raise an exception.
*/
public void startEntity(String name) throws SAXException {
this.ensureInitialization();
this.saxHandler.startEntity(name);
}
/**
* <i>[SAX LexicalHandler interface support]</i> Reports the end
* of an entity.
*
* @param name the name of the entity that is ending.
*
* @throws SAXException The application may raise an exception.
*/
public void endEntity(String name) throws SAXException {
this.saxHandler.endEntity(name);
}
/**
* <i>[SAX LexicalHandler interface support]</i> Reports the
* start of a CDATA section.
*
* @throws SAXException The application may raise an exception.
*/
public void startCDATA() throws SAXException {
this.ensureInitialization();
this.saxHandler.startCDATA();
}
/**
* <i>[SAX LexicalHandler interface support]</i> Reports the end
* of a CDATA section.
*
* @throws SAXException The application may raise an exception.
*/
public void endCDATA() throws SAXException {
this.saxHandler.endCDATA();
}
/**
* <i>[SAX LexicalHandler interface support]</i> Reports an XML
* comment anywhere in the document.
*
* @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.
*
* @throws SAXException The application may raise an exception.
*/
public void comment(char ch[], int start, int length)
throws SAXException {
this.ensureInitialization();
this.saxHandler.comment(ch, start, length);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -