in src/org/apache/xml/serialize/BaseMarkupSerializer.java [994:1244]
protected void serializeNode( Node node )
throws IOException
{
fCurrentNode = node;
// Based on the node type call the suitable SAX handler.
// Only comments entities and documents which are not
// handled by SAX are serialized directly.
switch ( node.getNodeType() ) {
case Node.TEXT_NODE : {
String text;
text = node.getNodeValue();
if ( text != null ) {
if (fDOMFilter !=null &&
(fDOMFilter.getWhatToShow() & NodeFilter.SHOW_TEXT)!= 0) {
short code = fDOMFilter.acceptNode(node);
switch (code) {
case NodeFilter.FILTER_REJECT:
case NodeFilter.FILTER_SKIP: {
break;
}
default: {
characters(text);
}
}
}
else if ( !_indenting || getElementState().preserveSpace
|| (text.replace('\n',' ').trim().length() != 0))
characters( text );
}
break;
}
case Node.CDATA_SECTION_NODE : {
String text = node.getNodeValue();
if ((features & DOMSerializerImpl.CDATA) != 0) {
if (text != null) {
if (fDOMFilter != null
&& (fDOMFilter.getWhatToShow()
& NodeFilter.SHOW_CDATA_SECTION)
!= 0) {
short code = fDOMFilter.acceptNode(node);
switch (code) {
case NodeFilter.FILTER_REJECT :
case NodeFilter.FILTER_SKIP :
{
// skip the CDATA node
return;
}
default :
{
//fall through..
}
}
}
startCDATA();
characters(text);
endCDATA();
}
} else {
// transform into a text node
characters(text);
}
break;
}
case Node.COMMENT_NODE : {
String text;
if ( ! _format.getOmitComments() ) {
text = node.getNodeValue();
if ( text != null ) {
if (fDOMFilter !=null &&
(fDOMFilter.getWhatToShow() & NodeFilter.SHOW_COMMENT)!= 0) {
short code = fDOMFilter.acceptNode(node);
switch (code) {
case NodeFilter.FILTER_REJECT:
case NodeFilter.FILTER_SKIP: {
// skip the comment node
return;
}
default: {
// fall through
}
}
}
comment( text );
}
}
break;
}
case Node.ENTITY_REFERENCE_NODE : {
Node child;
endCDATA();
content();
if (((features & DOMSerializerImpl.ENTITIES) != 0)
|| (node.getFirstChild() == null)) {
if (fDOMFilter !=null &&
(fDOMFilter.getWhatToShow() & NodeFilter.SHOW_ENTITY_REFERENCE)!= 0) {
short code = fDOMFilter.acceptNode(node);
switch (code) {
case NodeFilter.FILTER_REJECT:{
return; // remove the node
}
case NodeFilter.FILTER_SKIP: {
child = node.getFirstChild();
while ( child != null ) {
serializeNode( child );
child = child.getNextSibling();
}
return;
}
default: {
// fall through
}
}
}
checkUnboundNamespacePrefixedNode(node);
_printer.printText("&");
_printer.printText(node.getNodeName());
_printer.printText(";");
}
else {
child = node.getFirstChild();
while ( child != null ) {
serializeNode( child );
child = child.getNextSibling();
}
}
break;
}
case Node.PROCESSING_INSTRUCTION_NODE : {
if (fDOMFilter !=null &&
(fDOMFilter.getWhatToShow() & NodeFilter.SHOW_PROCESSING_INSTRUCTION)!= 0) {
short code = fDOMFilter.acceptNode(node);
switch (code) {
case NodeFilter.FILTER_REJECT:
case NodeFilter.FILTER_SKIP: {
return; // skip this node
}
default: { // fall through
}
}
}
processingInstructionIO( node.getNodeName(), node.getNodeValue() );
break;
}
case Node.ELEMENT_NODE : {
if (fDOMFilter !=null &&
(fDOMFilter.getWhatToShow() & NodeFilter.SHOW_ELEMENT)!= 0) {
short code = fDOMFilter.acceptNode(node);
switch (code) {
case NodeFilter.FILTER_REJECT: {
return;
}
case NodeFilter.FILTER_SKIP: {
Node child = node.getFirstChild();
while ( child != null ) {
serializeNode( child );
child = child.getNextSibling();
}
return; // skip this node
}
default: { // fall through
}
}
}
serializeElement( (Element) node );
break;
}
case Node.DOCUMENT_NODE : {
DocumentType docType;
// If there is a document type, use the SAX events to
// serialize it.
docType = ( (Document) node ).getDoctype();
if (docType != null) {
// DOM Level 2 (or higher)
try {
String internal;
_printer.enterDTD();
_docTypePublicId = docType.getPublicId();
_docTypeSystemId = docType.getSystemId();
internal = docType.getInternalSubset();
if ( internal != null && internal.length() > 0 )
_printer.printText( internal );
endDTD();
}
// DOM Level 1 -- does implementation have methods?
catch (NoSuchMethodError nsme) {
Class docTypeClass = docType.getClass();
String docTypePublicId = null;
String docTypeSystemId = null;
try {
java.lang.reflect.Method getPublicId = docTypeClass.getMethod("getPublicId", (Class[]) null);
if (getPublicId.getReturnType().equals(String.class)) {
docTypePublicId = (String)getPublicId.invoke(docType, (Object[]) null);
}
}
catch (Exception e) {
// ignore
}
try {
java.lang.reflect.Method getSystemId = docTypeClass.getMethod("getSystemId", (Class[]) null);
if (getSystemId.getReturnType().equals(String.class)) {
docTypeSystemId = (String)getSystemId.invoke(docType, (Object[]) null);
}
}
catch (Exception e) {
// ignore
}
_printer.enterDTD();
_docTypePublicId = docTypePublicId;
_docTypeSystemId = docTypeSystemId;
endDTD();
}
}
// !! Fall through
}
case Node.DOCUMENT_FRAGMENT_NODE : {
Node child;
// By definition this will happen if the node is a document,
// document fragment, etc. Just serialize its contents. It will
// work well for other nodes that we do not know how to serialize.
child = node.getFirstChild();
while ( child != null ) {
serializeNode( child );
child = child.getNextSibling();
}
break;
}
default:
break;
}
}