📄 saxoutputter.java
字号:
/**
* <p>
* This will invoke the callbacks for the content of an element.
* </p>
*
* @param node a <code>Content</code> node.
* @param namespaces <code>List</code> stack of Namespaces in scope.
*/
private void elementContent(Content node, NamespaceStack namespaces)
throws JDOMException {
// update locator
if (locator != null) {
locator.setNode(node);
}
if (node instanceof Element) {
element((Element) node, namespaces);
}
else if (node instanceof CDATA) {
cdata(((CDATA) node).getText());
}
else if (node instanceof Text) {
// contentHandler.characters()
characters(((Text) node).getText());
}
else if (node instanceof ProcessingInstruction) {
// contentHandler.processingInstruction()
processingInstruction((ProcessingInstruction) node);
}
else if (node instanceof Comment) {
// lexicalHandler.comment()
comment(((Comment) node).getText());
}
else if (node instanceof EntityRef) {
// contentHandler.skippedEntity()
entityRef((EntityRef) node);
}
else {
// Not a valid element child. This could happen with
// application-provided lists which may contain non
// JDOM objects.
handleError(new JDOMException("Invalid element content: " + node));
}
}
/**
* <p>
* This will be called for each chunk of CDATA section encountered.
* </p>
*
* @param cdataText all text in the CDATA section, including whitespace.
*/
private void cdata(String cdataText) throws JDOMException {
try {
if (lexicalHandler != null) {
lexicalHandler.startCDATA();
characters(cdataText);
lexicalHandler.endCDATA();
}
else {
characters(cdataText);
}
}
catch (SAXException se) {
throw new JDOMException("Exception in CDATA", se);
}
}
/**
* <p>
* This will be called for each chunk of character data encountered.
* </p>
*
* @param elementText all text in an element, including whitespace.
*/
private void characters(String elementText) throws JDOMException {
char[] c = elementText.toCharArray();
try {
contentHandler.characters(c, 0, c.length);
}
catch (SAXException se) {
throw new JDOMException("Exception in characters", se);
}
}
/**
* <p>
* This will be called for each chunk of comment data encontered.
* </p>
*
* @param commentText all text in a comment, including whitespace.
*/
private void comment(String commentText) throws JDOMException {
if (lexicalHandler != null) {
char[] c = commentText.toCharArray();
try {
lexicalHandler.comment(c, 0, c.length);
} catch (SAXException se) {
throw new JDOMException("Exception in comment", se);
}
}
}
/**
* <p>
* This will invoke the <code>ContentHandler.skippedEntity</code>
* callback when an entity reference is encountered.
* </p>
*
* @param entity <code>EntityRef</code>.
*/
private void entityRef(EntityRef entity) throws JDOMException {
if (entity != null) {
try {
// No need to worry about appending a '%' character as
// we do not support parameter entities
contentHandler.skippedEntity(entity.getName());
}
catch (SAXException se) {
throw new JDOMException("Exception in entityRef", se);
}
}
}
/**
* <p>
* Appends a namespace declaration in the form of a xmlns attribute to
* an attribute list, crerating this latter if needed.
* </p>
*
* @param atts <code>AttributeImpl</code> where to add the attribute.
* @param ns <code>Namespace</code> the namespace to declare.
*
* @return <code>AttributeImpl</code> the updated attribute list.
*/
private AttributesImpl addNsAttribute(AttributesImpl atts, Namespace ns) {
if (this.declareNamespaces) {
if (atts == null) {
atts = new AttributesImpl();
}
String prefix = ns.getPrefix();
if (prefix.equals("")) {
atts.addAttribute("", // namespace
"", // local name
"xmlns", // qualified name
"CDATA", // type
ns.getURI()); // value
}
else {
atts.addAttribute("", // namespace
"", // local name
"xmlns:" + ns.getPrefix(), // qualified name
"CDATA", // type
ns.getURI()); // value
}
}
return atts;
}
/**
* <p>
* Returns the SAX 2.0 attribute type string from the type of
* a JDOM Attribute.
* </p>
*
* @param type <code>int</code> the type of the JDOM attribute.
*
* @return <code>String</code> the SAX 2.0 attribute type string.
*
* @see org.jdom.Attribute#getAttributeType
* @see org.xml.sax.Attributes#getType
*/
private static String getAttributeTypeName(int type) {
if ((type < 0) || (type >= attrTypeToNameMap.length)) {
type = Attribute.UNDECLARED_TYPE;
}
return attrTypeToNameMap[type];
}
/**
* <p>
* Notifies the registered {@link ErrorHandler SAX error handler}
* (if any) of an input processing error. The error handler can
* choose to absorb the error and let the processing continue.
* </p>
*
* @param exception <code>JDOMException</code> containing the
* error information; will be wrapped in a
* {@link SAXParseException} when reported to
* the SAX error handler.
*
* @throws JDOMException if no error handler has been registered
* or if the error handler fired a
* {@link SAXException}.
*/
private void handleError(JDOMException exception) throws JDOMException {
if (errorHandler != null) {
try {
errorHandler.error(new SAXParseException(
exception.getMessage(), null, exception));
}
catch (SAXException se) {
if (se.getException() instanceof JDOMException) {
throw (JDOMException)(se.getException());
}
else {
throw new JDOMException(se.getMessage(), se);
}
}
}
else {
throw exception;
}
}
/**
* <p>
* Creates a SAX XMLReader.
* </p>
*
* @return <code>XMLReader</code> a SAX2 parser.
*
* @throws Exception if no parser can be created.
*/
protected XMLReader createParser() throws Exception {
XMLReader parser = null;
// Try using JAXP...
// Note we need JAXP 1.1, and if JAXP 1.0 is all that's
// available then the getXMLReader call fails and we skip
// to the hard coded default parser
try {
Class factoryClass =
Class.forName("javax.xml.parsers.SAXParserFactory");
// factory = SAXParserFactory.newInstance();
Method newParserInstance =
factoryClass.getMethod("newInstance", null);
Object factory = newParserInstance.invoke(null, null);
// jaxpParser = factory.newSAXParser();
Method newSAXParser = factoryClass.getMethod("newSAXParser", null);
Object jaxpParser = newSAXParser.invoke(factory, null);
// parser = jaxpParser.getXMLReader();
Class parserClass = jaxpParser.getClass();
Method getXMLReader =
parserClass.getMethod("getXMLReader", null);
parser = (XMLReader)getXMLReader.invoke(jaxpParser, null);
} catch (ClassNotFoundException e) {
//e.printStackTrace();
} catch (InvocationTargetException e) {
//e.printStackTrace();
} catch (NoSuchMethodException e) {
//e.printStackTrace();
} catch (IllegalAccessException e) {
//e.printStackTrace();
}
// Check to see if we got a parser yet, if not, try to use a
// hard coded default
if (parser == null) {
parser = XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
}
return parser;
}
/**
* <p>
* This will create a SAX XMLReader capable of parsing a DTD and
* configure it so that the DTD parsing events are routed to the
* handlers registered onto this SAXOutputter.
* </p>
*
* @return <code>XMLReader</code> a SAX2 parser.
*
* @throws JDOMException if no parser can be created.
*/
private XMLReader createDTDParser() throws JDOMException {
XMLReader parser = null;
// Get a parser instance
try
{
parser = createParser();
}
catch (Exception ex1) {
throw new JDOMException("Error in SAX parser allocation", ex1);
}
// Register handlers
if (this.getDTDHandler() != null) {
parser.setDTDHandler(this.getDTDHandler());
}
if (this.getEntityResolver() != null) {
parser.setEntityResolver(this.getEntityResolver());
}
if (this.getLexicalHandler() != null) {
try {
parser.setProperty(LEXICAL_HANDLER_SAX_PROPERTY,
this.getLexicalHandler());
}
catch (SAXException ex1) {
try {
parser.setProperty(LEXICAL_HANDLER_ALT_PROPERTY,
this.getLexicalHandler());
} catch (SAXException ex2) {
// Forget it!
}
}
}
if (this.getDeclHandler() != null) {
try {
parser.setProperty(DECL_HANDLER_SAX_PROPERTY,
this.getDeclHandler());
}
catch (SAXException ex1) {
try {
parser.setProperty(DECL_HANDLER_ALT_PROPERTY,
this.getDeclHandler());
} catch (SAXException ex2) {
// Forget it!
}
}
}
// Absorb errors as much as possible, per Laurent
parser.setErrorHandler(new DefaultHandler());
return parser;
}
/**
* Returns a JDOMLocator object referencing the node currently
* being processed by this outputter. The returned object is a
* snapshot of the location information and can thus safely be
* memorized for later use.
* <p>
* This method allows direct access to the location information
* maintained by SAXOutputter without requiring to implement
* <code>XMLFilter</code>. (In SAX, locators are only available
* though the <code>ContentHandler</code> interface).</p>
* <p>
* Note that location information is only available while
* SAXOutputter is outputting nodes. Hence this method should
* only be used by objects taking part in the output processing
* such as <code>ErrorHandler</code>s.
*
* @return a JDOMLocator object referencing the node currently
* being processed or <code>null</code> if no output
* operation is being performed.
*/
public JDOMLocator getLocator() {
return (locator != null)? new JDOMLocator(locator): null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -