Yuan.Wang
1 year ago
4 changed files with 701 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||||||
|
package org.dom4j.dtd; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by filip on 5.7.15. |
||||||
|
*/ |
||||||
|
public interface Decl { |
||||||
|
} |
@ -0,0 +1,102 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. |
||||||
|
* |
||||||
|
* This software is open source. |
||||||
|
* See the bottom of this file for the licence. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.dom4j.io; |
||||||
|
|
||||||
|
import javax.xml.transform.sax.SAXResult; |
||||||
|
|
||||||
|
import org.w3c.dom.Document; |
||||||
|
|
||||||
|
import org.xml.sax.ContentHandler; |
||||||
|
import org.xml.sax.ext.LexicalHandler; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* <code>DOMDocumentResult</code> implements a JAXP {@link SAXResult} for a |
||||||
|
* {@link org.w3c.dom.Document}. |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a> |
||||||
|
* @author Todd Wolff |
||||||
|
* @version $Revision: 1.1 $ |
||||||
|
*/ |
||||||
|
public class DOMDocumentResult extends SAXResult { |
||||||
|
private DOMSAXContentHandler contentHandler; |
||||||
|
|
||||||
|
public DOMDocumentResult() { |
||||||
|
this(new DOMSAXContentHandler()); |
||||||
|
} |
||||||
|
|
||||||
|
public DOMDocumentResult(DOMSAXContentHandler contentHandler) { |
||||||
|
this.contentHandler = contentHandler; |
||||||
|
super.setHandler(this.contentHandler); |
||||||
|
super.setLexicalHandler(this.contentHandler); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieves w3c dom object generated via transformation |
||||||
|
* |
||||||
|
* @return the Document created by the transformation |
||||||
|
*/ |
||||||
|
public Document getDocument() { |
||||||
|
return contentHandler.getDocument(); |
||||||
|
} |
||||||
|
|
||||||
|
// Overloaded methods
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
public void setHandler(ContentHandler handler) { |
||||||
|
if (handler instanceof DOMSAXContentHandler) { |
||||||
|
this.contentHandler = (DOMSAXContentHandler) handler; |
||||||
|
super.setHandler(this.contentHandler); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setLexicalHandler(LexicalHandler handler) { |
||||||
|
if (handler instanceof DOMSAXContentHandler) { |
||||||
|
this.contentHandler = (DOMSAXContentHandler) handler; |
||||||
|
super.setLexicalHandler(this.contentHandler); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Redistribution and use of this software and associated documentation |
||||||
|
* ("Software"), with or without modification, are permitted provided that the |
||||||
|
* following conditions are met: |
||||||
|
* |
||||||
|
* 1. Redistributions of source code must retain copyright statements and |
||||||
|
* notices. Redistributions must also contain a copy of this document. |
||||||
|
* |
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* 3. The name "DOM4J" must not be used to endorse or promote products derived |
||||||
|
* from this Software without prior written permission of MetaStuff, Ltd. For |
||||||
|
* written permission, please contact dom4j-info@metastuff.com. |
||||||
|
* |
||||||
|
* 4. Products derived from this Software may not be called "DOM4J" nor may |
||||||
|
* "DOM4J" appear in their names without prior written permission of MetaStuff, |
||||||
|
* Ltd. DOM4J is a registered trademark of MetaStuff, Ltd. |
||||||
|
* |
||||||
|
* 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
|
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND |
||||||
|
* ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE |
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. |
||||||
|
*/ |
@ -0,0 +1,548 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. |
||||||
|
* |
||||||
|
* This software is open source. |
||||||
|
* See the bottom of this file for the licence. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.dom4j.io; |
||||||
|
|
||||||
|
import java.lang.reflect.Method; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.dom4j.Branch; |
||||||
|
import org.dom4j.Document; |
||||||
|
import org.dom4j.Element; |
||||||
|
import org.dom4j.Namespace; |
||||||
|
import org.dom4j.QName; |
||||||
|
import org.dom4j.dom.DOMAttribute; |
||||||
|
import org.dom4j.dom.DOMCDATA; |
||||||
|
import org.dom4j.dom.DOMComment; |
||||||
|
import org.dom4j.dom.DOMDocumentFactory; |
||||||
|
import org.dom4j.dom.DOMElement; |
||||||
|
import org.dom4j.dom.DOMText; |
||||||
|
import org.dom4j.tree.NamespaceStack; |
||||||
|
import org.w3c.dom.ProcessingInstruction; |
||||||
|
import org.xml.sax.Attributes; |
||||||
|
import org.xml.sax.EntityResolver; |
||||||
|
import org.xml.sax.InputSource; |
||||||
|
import org.xml.sax.Locator; |
||||||
|
import org.xml.sax.SAXException; |
||||||
|
import org.xml.sax.SAXParseException; |
||||||
|
import org.xml.sax.ext.LexicalHandler; |
||||||
|
import org.xml.sax.ext.Locator2; |
||||||
|
import org.xml.sax.helpers.DefaultHandler; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* <code>SAXContentHandler</code> builds W3C DOM object via SAX events. |
||||||
|
* |
||||||
|
* @author <a href="mailto:jstrachan@apache.org">James Strachan </a> |
||||||
|
* @author Todd Wolff |
||||||
|
* |
||||||
|
* </p> |
||||||
|
*/ |
||||||
|
public class DOMSAXContentHandler extends DefaultHandler implements LexicalHandler { |
||||||
|
|
||||||
|
/** The factory used to create new <code>Document</code> instances */ |
||||||
|
private DOMDocumentFactory documentFactory; |
||||||
|
|
||||||
|
/** The document that is being built */ |
||||||
|
private Document document; |
||||||
|
|
||||||
|
/** stack of <code>Element</code> objects */ |
||||||
|
private ElementStack elementStack; |
||||||
|
|
||||||
|
/** stack of <code>Namespace</code> and <code>QName</code> objects */ |
||||||
|
private NamespaceStack namespaceStack; |
||||||
|
|
||||||
|
/** the Locator */ |
||||||
|
private Locator locator; |
||||||
|
|
||||||
|
/** Flag used to indicate that we are inside a CDATA section */ |
||||||
|
private boolean insideCDATASection; |
||||||
|
|
||||||
|
/** |
||||||
|
* buffer to hold contents of cdata section across multiple characters |
||||||
|
* events |
||||||
|
*/ |
||||||
|
private StringBuffer cdataText; |
||||||
|
|
||||||
|
/** The number of namespaces that are declared in the current scope */ |
||||||
|
private int declaredNamespaceIndex; |
||||||
|
|
||||||
|
private InputSource inputSource; |
||||||
|
|
||||||
|
/** The current element we are on */ |
||||||
|
private Element currentElement; |
||||||
|
|
||||||
|
/** The entity resolver */ |
||||||
|
private EntityResolver entityResolver; |
||||||
|
|
||||||
|
/** Whether adjacent text nodes should be merged */ |
||||||
|
private boolean mergeAdjacentText = false; |
||||||
|
|
||||||
|
/** Have we added text to the buffer */ |
||||||
|
private boolean textInTextBuffer = false; |
||||||
|
|
||||||
|
/** Should we ignore comments */ |
||||||
|
private boolean ignoreComments = false; |
||||||
|
|
||||||
|
/** Buffer used to concatenate text together */ |
||||||
|
private StringBuffer textBuffer; |
||||||
|
|
||||||
|
/** Holds value of property stripWhitespaceText. */ |
||||||
|
private boolean stripWhitespaceText = false; |
||||||
|
|
||||||
|
public DOMSAXContentHandler() { |
||||||
|
this((DOMDocumentFactory)DOMDocumentFactory.getInstance()); |
||||||
|
} |
||||||
|
|
||||||
|
public DOMSAXContentHandler(DOMDocumentFactory documentFactory) { |
||||||
|
this.documentFactory = documentFactory; |
||||||
|
this.elementStack = createElementStack(); |
||||||
|
this.namespaceStack = new NamespaceStack(documentFactory); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieves w3c document object built via generated sax events. |
||||||
|
* |
||||||
|
* @return the document that has been or is being built |
||||||
|
*/ |
||||||
|
public org.w3c.dom.Document getDocument() { |
||||||
|
if (document == null) { |
||||||
|
document = createDocument(); |
||||||
|
} |
||||||
|
|
||||||
|
return (org.w3c.dom.Document)document; |
||||||
|
} |
||||||
|
|
||||||
|
// ContentHandler interface
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
public void setDocumentLocator(Locator documentLocator) { |
||||||
|
this.locator = documentLocator; |
||||||
|
} |
||||||
|
|
||||||
|
public void processingInstruction(String target, String data) |
||||||
|
throws SAXException { |
||||||
|
if (mergeAdjacentText && textInTextBuffer) { |
||||||
|
completeCurrentTextNode(); |
||||||
|
} |
||||||
|
ProcessingInstruction pi = (ProcessingInstruction)documentFactory.createProcessingInstruction(target, data); |
||||||
|
if (currentElement != null) { |
||||||
|
((org.w3c.dom.Element)currentElement).appendChild(pi); |
||||||
|
} else { |
||||||
|
getDocument().appendChild(pi); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void startPrefixMapping(String prefix, String uri) |
||||||
|
throws SAXException { |
||||||
|
namespaceStack.push(prefix, uri); |
||||||
|
} |
||||||
|
|
||||||
|
public void endPrefixMapping(String prefix) throws SAXException { |
||||||
|
namespaceStack.pop(prefix); |
||||||
|
declaredNamespaceIndex = namespaceStack.size(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startDocument() throws SAXException { |
||||||
|
document = null; |
||||||
|
currentElement = null; |
||||||
|
|
||||||
|
elementStack.clear(); |
||||||
|
|
||||||
|
namespaceStack.clear(); |
||||||
|
declaredNamespaceIndex = 0; |
||||||
|
|
||||||
|
if (mergeAdjacentText && (textBuffer == null)) { |
||||||
|
textBuffer = new StringBuffer(); |
||||||
|
} |
||||||
|
|
||||||
|
textInTextBuffer = false; |
||||||
|
} |
||||||
|
|
||||||
|
public void endDocument() throws SAXException { |
||||||
|
namespaceStack.clear(); |
||||||
|
elementStack.clear(); |
||||||
|
currentElement = null; |
||||||
|
textBuffer = null; |
||||||
|
} |
||||||
|
|
||||||
|
public void startElement(String namespaceURI, String localName, |
||||||
|
String qualifiedName, Attributes attributes) throws SAXException { |
||||||
|
if (mergeAdjacentText && textInTextBuffer) { |
||||||
|
completeCurrentTextNode(); |
||||||
|
} |
||||||
|
|
||||||
|
QName qName = namespaceStack.getQName(namespaceURI, localName, |
||||||
|
qualifiedName); |
||||||
|
|
||||||
|
Branch branch = currentElement; |
||||||
|
|
||||||
|
if (branch == null) { |
||||||
|
branch = (org.dom4j.Document)getDocument(); |
||||||
|
} |
||||||
|
|
||||||
|
Element element = new DOMElement(qName); |
||||||
|
branch.add(element); |
||||||
|
|
||||||
|
// add all declared namespaces
|
||||||
|
addDeclaredNamespaces(element); |
||||||
|
|
||||||
|
// now lets add all attribute values
|
||||||
|
addAttributes(element, attributes); |
||||||
|
|
||||||
|
elementStack.pushElement(element); |
||||||
|
currentElement = element; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public void endElement(String namespaceURI, String localName, String qName) |
||||||
|
throws SAXException { |
||||||
|
if (mergeAdjacentText && textInTextBuffer) { |
||||||
|
completeCurrentTextNode(); |
||||||
|
} |
||||||
|
|
||||||
|
elementStack.popElement(); |
||||||
|
currentElement = elementStack.peekElement(); |
||||||
|
} |
||||||
|
|
||||||
|
public void characters(char[] ch, int start, int end) throws SAXException { |
||||||
|
if (end == 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (currentElement != null) { |
||||||
|
if (insideCDATASection) { |
||||||
|
if (mergeAdjacentText && textInTextBuffer) { |
||||||
|
completeCurrentTextNode(); |
||||||
|
} |
||||||
|
cdataText.append(new String(ch, start, end)); |
||||||
|
} else { |
||||||
|
if (mergeAdjacentText) { |
||||||
|
textBuffer.append(ch, start, end); |
||||||
|
textInTextBuffer = true; |
||||||
|
} else { |
||||||
|
DOMText text = new DOMText(new String(ch, start, end)); |
||||||
|
((DOMElement)currentElement).add(text); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// ErrorHandler interface
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
* This method is called when a warning occurs during the parsing of the |
||||||
|
* document. This method does nothing. |
||||||
|
* |
||||||
|
* @param exception |
||||||
|
* DOCUMENT ME! |
||||||
|
* |
||||||
|
* @throws SAXException |
||||||
|
* DOCUMENT ME! |
||||||
|
*/ |
||||||
|
public void warning(SAXParseException exception) throws SAXException { |
||||||
|
// ignore warnings by default
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This method is called when an error is detected during parsing such as a |
||||||
|
* validation error. This method rethrows the exception |
||||||
|
* |
||||||
|
* @param exception |
||||||
|
* DOCUMENT ME! |
||||||
|
* |
||||||
|
* @throws SAXException |
||||||
|
* DOCUMENT ME! |
||||||
|
*/ |
||||||
|
public void error(SAXParseException exception) throws SAXException { |
||||||
|
throw exception; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This method is called when a fatal error occurs during parsing. This |
||||||
|
* method rethrows the exception |
||||||
|
* |
||||||
|
* @param exception |
||||||
|
* DOCUMENT ME! |
||||||
|
* |
||||||
|
* @throws SAXException |
||||||
|
* DOCUMENT ME! |
||||||
|
*/ |
||||||
|
public void fatalError(SAXParseException exception) throws SAXException { |
||||||
|
throw exception; |
||||||
|
} |
||||||
|
|
||||||
|
// LexicalHandler interface
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
public void startDTD(String name, String publicId, String systemId) |
||||||
|
throws SAXException { |
||||||
|
// not supported
|
||||||
|
} |
||||||
|
|
||||||
|
public void endDTD() throws SAXException { |
||||||
|
// not supported
|
||||||
|
} |
||||||
|
|
||||||
|
public void startEntity(String name) throws SAXException { |
||||||
|
// not supported
|
||||||
|
} |
||||||
|
|
||||||
|
public void endEntity(String name) throws SAXException { |
||||||
|
// not supported
|
||||||
|
} |
||||||
|
|
||||||
|
public void startCDATA() throws SAXException { |
||||||
|
insideCDATASection = true; |
||||||
|
cdataText = new StringBuffer(); |
||||||
|
} |
||||||
|
|
||||||
|
public void endCDATA() throws SAXException { |
||||||
|
insideCDATASection = false; |
||||||
|
DOMCDATA cdata = new DOMCDATA(cdataText.toString()); |
||||||
|
((DOMElement)currentElement).add(cdata); |
||||||
|
} |
||||||
|
|
||||||
|
public void comment(char[] ch, int start, int end) throws SAXException { |
||||||
|
if (!ignoreComments) { |
||||||
|
if (mergeAdjacentText && textInTextBuffer) { |
||||||
|
completeCurrentTextNode(); |
||||||
|
} |
||||||
|
|
||||||
|
String text = new String(ch, start, end); |
||||||
|
|
||||||
|
if (text.length() > 0) { |
||||||
|
DOMComment domComment = new DOMComment(text); |
||||||
|
if (currentElement != null) { |
||||||
|
((DOMElement)currentElement).add(domComment); |
||||||
|
} else { |
||||||
|
getDocument().appendChild(domComment); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Properties
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
public ElementStack getElementStack() { |
||||||
|
return elementStack; |
||||||
|
} |
||||||
|
|
||||||
|
public void setElementStack(ElementStack elementStack) { |
||||||
|
this.elementStack = elementStack; |
||||||
|
} |
||||||
|
|
||||||
|
public EntityResolver getEntityResolver() { |
||||||
|
return entityResolver; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEntityResolver(EntityResolver entityResolver) { |
||||||
|
this.entityResolver = entityResolver; |
||||||
|
} |
||||||
|
|
||||||
|
public InputSource getInputSource() { |
||||||
|
return inputSource; |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputSource(InputSource inputSource) { |
||||||
|
this.inputSource = inputSource; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns whether adjacent text nodes should be merged together. |
||||||
|
* |
||||||
|
* @return Value of property mergeAdjacentText. |
||||||
|
*/ |
||||||
|
public boolean isMergeAdjacentText() { |
||||||
|
return mergeAdjacentText; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets whether or not adjacent text nodes should be merged together when |
||||||
|
* parsing. |
||||||
|
* |
||||||
|
* @param mergeAdjacentText |
||||||
|
* New value of property mergeAdjacentText. |
||||||
|
*/ |
||||||
|
public void setMergeAdjacentText(boolean mergeAdjacentText) { |
||||||
|
this.mergeAdjacentText = mergeAdjacentText; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets whether whitespace between element start and end tags should be |
||||||
|
* ignored |
||||||
|
* |
||||||
|
* @return Value of property stripWhitespaceText. |
||||||
|
*/ |
||||||
|
public boolean isStripWhitespaceText() { |
||||||
|
return stripWhitespaceText; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets whether whitespace between element start and end tags should be |
||||||
|
* ignored. |
||||||
|
* |
||||||
|
* @param stripWhitespaceText |
||||||
|
* New value of property stripWhitespaceText. |
||||||
|
*/ |
||||||
|
public void setStripWhitespaceText(boolean stripWhitespaceText) { |
||||||
|
this.stripWhitespaceText = stripWhitespaceText; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns whether we should ignore comments or not. |
||||||
|
* |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public boolean isIgnoreComments() { |
||||||
|
return ignoreComments; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets whether we should ignore comments or not. |
||||||
|
* |
||||||
|
* @param ignoreComments |
||||||
|
* whether we should ignore comments or not. |
||||||
|
*/ |
||||||
|
public void setIgnoreComments(boolean ignoreComments) { |
||||||
|
this.ignoreComments = ignoreComments; |
||||||
|
} |
||||||
|
|
||||||
|
// Implementation methods
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
protected void completeCurrentTextNode() { |
||||||
|
if (stripWhitespaceText) { |
||||||
|
boolean whitespace = true; |
||||||
|
for (int i = 0, size = textBuffer.length(); i < size; i++) { |
||||||
|
if (!Character.isWhitespace(textBuffer.charAt(i))) { |
||||||
|
whitespace = false; |
||||||
|
|
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
if (!whitespace) { |
||||||
|
DOMText domText = new DOMText(textBuffer.toString()); |
||||||
|
((DOMElement)currentElement).add(domText); |
||||||
|
} |
||||||
|
} else { |
||||||
|
DOMText domText = new DOMText(textBuffer.toString()); |
||||||
|
((DOMElement)currentElement).add(domText); |
||||||
|
} |
||||||
|
|
||||||
|
textBuffer.setLength(0); |
||||||
|
textInTextBuffer = false; |
||||||
|
} |
||||||
|
|
||||||
|
protected Document createDocument() { |
||||||
|
String encoding = getEncoding(); |
||||||
|
Document doc = documentFactory.createDocument(encoding); |
||||||
|
|
||||||
|
// set the EntityResolver
|
||||||
|
doc.setEntityResolver(entityResolver); |
||||||
|
|
||||||
|
if (inputSource != null) { |
||||||
|
doc.setName(inputSource.getSystemId()); |
||||||
|
} |
||||||
|
|
||||||
|
return doc; |
||||||
|
} |
||||||
|
|
||||||
|
private String getEncoding() { |
||||||
|
if (locator == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
if (locator instanceof Locator2) { |
||||||
|
return ((Locator2) locator).getEncoding(); |
||||||
|
} |
||||||
|
|
||||||
|
// couldn't determine encoding, returning null...
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
protected void addDeclaredNamespaces(Element element) { |
||||||
|
for (int size = namespaceStack.size(); declaredNamespaceIndex < size; |
||||||
|
declaredNamespaceIndex++) { |
||||||
|
Namespace namespace = namespaceStack |
||||||
|
.getNamespace(declaredNamespaceIndex); |
||||||
|
String attributeName = attributeNameForNamespace(namespace); |
||||||
|
((DOMElement)element).setAttribute(attributeName, namespace.getURI()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void addAttributes(Element element, Attributes attributes) { |
||||||
|
int size = attributes.getLength(); |
||||||
|
for (int i = 0; i < size; i++) { |
||||||
|
String attributeQName = attributes.getQName(i); |
||||||
|
if (!attributeQName.startsWith("xmlns")) { |
||||||
|
String attributeURI = attributes.getURI(i); |
||||||
|
String attributeLocalName = attributes.getLocalName(i); |
||||||
|
String attributeValue = attributes.getValue(i); |
||||||
|
QName qName = namespaceStack.getAttributeQName( |
||||||
|
attributeURI, attributeLocalName, attributeQName); |
||||||
|
DOMAttribute domAttribute = new DOMAttribute(qName, attributeValue); |
||||||
|
((DOMElement)element).setAttributeNode(domAttribute); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected ElementStack createElementStack() { |
||||||
|
return new ElementStack(); |
||||||
|
} |
||||||
|
|
||||||
|
protected String attributeNameForNamespace(Namespace namespace) { |
||||||
|
String xmlns = "xmlns"; |
||||||
|
String prefix = namespace.getPrefix(); |
||||||
|
|
||||||
|
if (prefix.length() > 0) { |
||||||
|
return xmlns + ":" + prefix; |
||||||
|
} |
||||||
|
|
||||||
|
return xmlns; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Redistribution and use of this software and associated documentation |
||||||
|
* ("Software"), with or without modification, are permitted provided that the |
||||||
|
* following conditions are met: |
||||||
|
* |
||||||
|
* 1. Redistributions of source code must retain copyright statements and |
||||||
|
* notices. Redistributions must also contain a copy of this document. |
||||||
|
* |
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* 3. The name "DOM4J" must not be used to endorse or promote products derived |
||||||
|
* from this Software without prior written permission of MetaStuff, Ltd. For |
||||||
|
* written permission, please contact dom4j-info@metastuff.com. |
||||||
|
* |
||||||
|
* 4. Products derived from this Software may not be called "DOM4J" nor may |
||||||
|
* "DOM4J" appear in their names without prior written permission of MetaStuff, |
||||||
|
* Ltd. DOM4J is a registered trademark of MetaStuff, Ltd. |
||||||
|
* |
||||||
|
* 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
|
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND |
||||||
|
* ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE |
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. |
||||||
|
*/ |
@ -0,0 +1,44 @@ |
|||||||
|
package org.dom4j.util; |
||||||
|
|
||||||
|
/** |
||||||
|
* Contains utilities related to strings. |
||||||
|
* |
||||||
|
* @author Marián Petráš |
||||||
|
*/ |
||||||
|
public final class StringUtils { |
||||||
|
|
||||||
|
private StringUtils() {} |
||||||
|
|
||||||
|
/** |
||||||
|
* Finds out if the given character sequence starts with a whitespace |
||||||
|
* character. |
||||||
|
* |
||||||
|
* @return {@code true} if the given character sequence is not empty |
||||||
|
* and starts with a whitespace character; {@code false} otherwise |
||||||
|
* @exception NullPointerException if the given character sequence is |
||||||
|
* {@code null} |
||||||
|
*/ |
||||||
|
public static boolean startsWithWhitespace(final CharSequence charSeq) { |
||||||
|
if (charSeq.length() == 0) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return Character.isWhitespace(charSeq.charAt(0)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Finds out if the given character sequence ends with a whitespace |
||||||
|
* character. |
||||||
|
* |
||||||
|
* @return {@code true} if the given character sequence is not empty |
||||||
|
* and ends with a whitespace character; {@code false} otherwise |
||||||
|
* @exception NullPointerException if the given character sequence is |
||||||
|
* {@code null} |
||||||
|
*/ |
||||||
|
public static boolean endsWithWhitespace(final CharSequence charSeq) { |
||||||
|
if (charSeq.length() == 0) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return Character.isWhitespace(charSeq.charAt(charSeq.length() - 1)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue