All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.docx4j.openpackaging.parts.StAXHandlerAbstract Maven / Gradle / Ivy

Go to download

docx4j is a library which helps you to work with the Office Open XML file format as used in docx documents, pptx presentations, and xlsx spreadsheets.

There is a newer version: 11.4.11
Show newest version
package org.docx4j.openpackaging.parts;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.stream.events.XMLEvent;

import org.docx4j.openpackaging.exceptions.LocationAwareXMLStreamException;

public abstract class StAXHandlerAbstract implements StAXHandlerInterface {
	
	
	/**
	 * Implement this method; for an example, see VariableReplaceStAX sample
	 * 
	 * @param xmlr
	 * @param writer
	 */
	public abstract void handleCharacters(XMLStreamReader xmlr, XMLStreamWriter writer)  throws XMLStreamException;
		
	
	@Override
	public void handle(XMLStreamReader xmlr,
			XMLStreamWriter xmlWriter) throws LocationAwareXMLStreamException, XMLStreamException {
		
        while (xmlr.hasNext())          
        {   
        	try {
        		write(xmlr, xmlWriter);
        	} catch (XMLStreamException xse) {
//        		System.out.println("line: " + xmlr.getLocation().getLineNumber());
//        		System.out.println("col: " + xmlr.getLocation().getColumnNumber());
        		throw new LocationAwareXMLStreamException(xse.getMessage(), xse, xmlr.getLocation());
        	}
            xmlr.next();
        }
		
		
	}
	
	
	/**
	 * This is designed to cater for the common case of replacing character content.
	 * Everything else is passed through unchanged.
	 * 
	 * If you wanted to find say a w:tbl then handle it with JAXB, you'll need to
	 * override this method and handle START_ELEMENT and END_ELEMENT differently
	 * (keeping track of where you are, so they match).
	 * 
	 * @param xmlr
	 * @param writer
	 * @throws XMLStreamException
	 */
	public void write(XMLStreamReader xmlr, XMLStreamWriter writer)
			throws XMLStreamException {
		
		switch (xmlr.getEventType()) {
		
			case XMLEvent.START_ELEMENT:
				final String localName = xmlr.getLocalName();
	//			System.out.println(localName + " " + xmlr.getNamespaceURI() );
				if (xmlr.getNamespaceURI()==null) {
					writer.writeStartElement(localName);												
				} else {
					writer.writeStartElement(xmlr.getPrefix(), localName, xmlr.getNamespaceURI());
				}
				
	            int namespaceCount = xmlr.getNamespaceCount();
	            for (int i = namespaceCount - 1; i >= 0; i--) {
	            	writer.writeNamespace(xmlr.getNamespacePrefix(i),
	            			xmlr.getNamespaceURI(i));
	            }
	            int attributeCount = xmlr.getAttributeCount();
	            for (int i = 0; i < attributeCount; i++) {
	            	
					if (xmlr.getAttributeNamespace(i)==null) {

		            	writer.writeAttribute(
		            			xmlr.getAttributeLocalName(i),
		            			xmlr.getAttributeValue(i));
						
					} else {
		            	writer.writeAttribute(xmlr.getAttributePrefix(i),
		            			xmlr.getAttributeNamespace(i),
		            			xmlr.getAttributeLocalName(i),
		            			xmlr.getAttributeValue(i));
					}
	            }
	
	            break;
	            
			case XMLEvent.END_ELEMENT:
				writer.writeEndElement();
				break;
			case XMLEvent.SPACE:
				break;
				
			case XMLEvent.CHARACTERS:
				
				handleCharacters( xmlr, writer);	// TODO: include identity implementation		
				break;
				
			case XMLEvent.PROCESSING_INSTRUCTION:
				writer.writeProcessingInstruction(xmlr.getPITarget(),
						xmlr.getPIData());
				break;
			case XMLEvent.CDATA:
				writer.writeCData(xmlr.getText());
				break;
			case XMLEvent.COMMENT:
				writer.writeComment(xmlr.getText());
				break;
			case XMLEvent.ENTITY_REFERENCE:
				writer.writeEntityRef(xmlr.getLocalName());
				break;
			case XMLEvent.START_DOCUMENT:
				String encoding = "UTF-8"; //xmlr.getCharacterEncodingScheme();
						
				String version = xmlr.getVersion();
				if (encoding != null && version != null)
					writer.writeStartDocument(encoding, version);
				else if (version != null)
					writer.writeStartDocument(xmlr.getVersion());
				break;
			case XMLEvent.END_DOCUMENT:
				writer.writeEndDocument();
				break;
		
		}
	}
	


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy