📄 saxhandler.java
字号:
*
* @param name entity name
* @param publicID public id
* @param systemID system id
* @throws SAXException when things go wrong
*/
public void externalEntityDecl(String name,
String publicID, String systemID)
throws SAXException {
// Store the public and system ids for the name
externalEntities.put(name, new String[]{publicID, systemID});
if (!inInternalSubset) return;
internalSubset.append(" <!ENTITY ")
.append(name);
appendExternalId(publicID, systemID);
internalSubset.append(">\n");
}
/**
* This handles an attribute declaration in the internal subset.
*
* @param eName <code>String</code> element name of attribute
* @param aName <code>String</code> attribute name
* @param type <code>String</code> attribute type
* @param valueDefault <code>String</code> default value of attribute
* @param value <code>String</code> value of attribute
* @throws SAXException
*/
public void attributeDecl(String eName, String aName, String type,
String valueDefault, String value)
throws SAXException {
if (!inInternalSubset) return;
internalSubset.append(" <!ATTLIST ")
.append(eName)
.append(' ')
.append(aName)
.append(' ')
.append(type)
.append(' ');
if (valueDefault != null) {
internalSubset.append(valueDefault);
} else {
internalSubset.append('\"')
.append(value)
.append('\"');
}
if ((valueDefault != null) && (valueDefault.equals("#FIXED"))) {
internalSubset.append(" \"")
.append(value)
.append('\"');
}
internalSubset.append(">\n");
}
/**
* Handle an element declaration in a DTD.
*
* @param name <code>String</code> name of element
* @param model <code>String</code> model of the element in DTD syntax
* @throws SAXException
*/
public void elementDecl(String name, String model) throws SAXException {
// Skip elements that come from the external subset
if (!inInternalSubset) return;
internalSubset.append(" <!ELEMENT ")
.append(name)
.append(' ')
.append(model)
.append(">\n");
}
/**
* Handle an internal entity declaration in a DTD.
*
* @param name <code>String</code> name of entity
* @param value <code>String</code> value of the entity
* @throws SAXException
*/
public void internalEntityDecl(String name, String value)
throws SAXException {
// Skip entities that come from the external subset
if (!inInternalSubset) return;
internalSubset.append(" <!ENTITY ");
if (name.startsWith("%")) {
internalSubset.append("% ").append(name.substring(1));
} else {
internalSubset.append(name);
}
internalSubset.append(" \"")
.append(value)
.append("\">\n");
}
/**
* This will indicate that a processing instruction has been encountered.
* (The XML declaration is not a processing instruction and will not
* be reported.)
*
* @param target <code>String</code> target of PI
* @param data <code>String</code> containing all data sent to the PI.
* This typically looks like one or more attribute value
* pairs.
* @throws SAXException when things go wrong
*/
public void processingInstruction(String target, String data)
throws SAXException {
if (suppress) return;
flushCharacters();
if (atRoot) {
factory.addContent(document, factory.processingInstruction(target, data));
} else {
factory.addContent(getCurrentElement(),
factory.processingInstruction(target, data));
}
}
/**
* This indicates that an unresolvable entity reference has been
* encountered, normally because the external DTD subset has not been
* read.
*
* @param name <code>String</code> name of entity
* @throws SAXException when things go wrong
*/
public void skippedEntity(String name)
throws SAXException {
// We don't handle parameter entity references.
if (name.startsWith("%")) return;
flushCharacters();
factory.addContent(getCurrentElement(), factory.entityRef(name));
}
/**
* This will add the prefix mapping to the JDOM
* <code>Document</code> object.
*
* @param prefix <code>String</code> namespace prefix.
* @param uri <code>String</code> namespace URI.
*/
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
if (suppress) return;
Namespace ns = Namespace.getNamespace(prefix, uri);
declaredNamespaces.add(ns);
}
/**
* This reports the occurrence of an actual element. It will include
* the element's attributes, with the exception of XML vocabulary
* specific attributes, such as
* <code>xmlns:[namespace prefix]</code> and
* <code>xsi:schemaLocation</code>.
*
* @param namespaceURI <code>String</code> namespace URI this element
* is associated with, or an empty
* <code>String</code>
* @param localName <code>String</code> name of element (with no
* namespace prefix, if one is present)
* @param qName <code>String</code> XML 1.0 version of element name:
* [namespace prefix]:[localName]
* @param atts <code>Attributes</code> list for this element
* @throws SAXException when things go wrong
*/
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts)
throws SAXException {
if (suppress) return;
Element element = null;
if ((namespaceURI != null) && (!namespaceURI.equals(""))) {
String prefix = "";
// Determine any prefix on the Element
if (!qName.equals(localName)) {
int split = qName.indexOf(":");
prefix = qName.substring(0, split);
}
Namespace elementNamespace =
Namespace.getNamespace(prefix, namespaceURI);
element = factory.element(localName, elementNamespace);
} else {
element = factory.element(localName);
}
// Take leftover declared namespaces and add them to this element's
// map of namespaces
if (declaredNamespaces.size() > 0) {
transferNamespaces(element);
}
// Handle attributes
for (int i=0, len=atts.getLength(); i<len; i++) {
Attribute attribute = null;
String attLocalName = atts.getLocalName(i);
String attQName = atts.getQName(i);
int attType = getAttributeType(atts.getType(i));
// Bypass any xmlns attributes which might appear, as we got
// them already in startPrefixMapping().
// This is sometimes necessary when SAXHandler is used with
// another source than SAXBuilder, as with JDOMResult.
if (attQName.startsWith("xmlns:") || attQName.equals("xmlns")) {
continue;
}
// First clause per http://markmail.org/message/2p245ggcjst27xe6
// patch from Mattias Jiderhamn
if ("".equals(attLocalName) && attQName.indexOf(":") == -1) {
attribute = factory.attribute(attQName, atts.getValue(i), attType);
} else if (!attQName.equals(attLocalName)) {
String attPrefix = attQName.substring(0, attQName.indexOf(":"));
Namespace attNs = Namespace.getNamespace(attPrefix,
atts.getURI(i));
attribute = factory.attribute(attLocalName, atts.getValue(i),
attType, attNs);
} else {
attribute = factory.attribute(attLocalName, atts.getValue(i),
attType);
}
factory.setAttribute(element, attribute);
}
flushCharacters();
if (atRoot) {
document.setRootElement(element); // XXX should we use a factory call?
atRoot = false;
} else {
factory.addContent(getCurrentElement(), element);
}
currentElement = element;
}
/**
* This will take the supplied <code>{@link Element}</code> and
* transfer its namespaces to the global namespace storage.
*
* @param element <code>Element</code> to read namespaces from.
*/
private void transferNamespaces(Element element) {
Iterator i = declaredNamespaces.iterator();
while (i.hasNext()) {
Namespace ns = (Namespace)i.next();
if (ns != element.getNamespace()) {
element.addNamespaceDeclaration(ns);
}
}
declaredNamespaces.clear();
}
/**
* This will report character data (within an element).
*
* @param ch <code>char[]</code> character array with character data
* @param start <code>int</code> index in array where data starts.
* @param length <code>int</code> length of data.
* @throws SAXException
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
if (suppress || (length == 0))
return;
if (previousCDATA != inCDATA) {
flushCharacters();
}
textBuffer.append(ch, start, length);
}
/**
* Capture ignorable whitespace as text. If
* setIgnoringElementContentWhitespace(true) has been called then this
* method does nothing.
*
* @param ch <code>[]</code> - char array of ignorable whitespace
* @param start <code>int</code> - starting position within array
* @param length <code>int</code> - length of whitespace after start
* @throws SAXException when things go wrong
*/
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
if (!ignoringWhite) {
characters(ch, start, length);
}
}
/**
* This will flush any characters from SAX character calls we've
* been buffering.
*
* @throws SAXException when things go wrong
*/
protected void flushCharacters() throws SAXException {
if (ignoringBoundaryWhite) {
if (!textBuffer.isAllWhitespace()) {
flushCharacters(textBuffer.toString());
}
}
else {
flushCharacters(textBuffer.toString());
}
textBuffer.clear();
}
/**
* Flush the given string into the document. This is a protected method
* so subclassers can control text handling without knowledge of the
* internals of this class.
*
* @param data string to flush
*/
protected void flushCharacters(String data) throws SAXException {
if (data.length() == 0) {
previousCDATA = inCDATA;
return;
}
/**
* This is commented out because of some problems with
* the inline DTDs that Xerces seems to have.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -