📄 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 + -