public class NodeFactory
extends Object
Builders use a NodeFactory
object
to construct each Node
object (Element
,
Text
, Attribute
, etc.) they add to the
tree. The default implementation simply calls the relevant
constructor, stuffs the resulting Node
object in a
length one Nodes
object, and returns it.
Subclassing this class allows builders to produce
instance of subclasses (for example,
HTMLElement
) instead of the
base classes.
Subclasses can also filter content while building.
For example, namespaces could be added to or changed
on all elements. Comments could be deleted. Processing
instructions can be changed into elements. An
xinclude:include
element could be replaced
with the content it references. All such changes must be
consistent with the usual rules of well-formedness. For
example, the makeDocType()
method should not
return a list containing two DocType
objects
because an XML document can have at most one document type
declaration. Nor should it return a list containing an element,
because an element cannot appear in a document prolog. However,
it could return a list containing any number of comments and
processing instructions, and not more than one DocType
object.
Constructor and Description |
---|
NodeFactory()
Constructs a new node factory.
|
Modifier and Type | Method and Description |
---|---|
void | finishMakingDocument(Document document)
Signals the end of a document.
|
Nodes | finishMakingElement(Element element)
Signals the end of an element.
|
Nodes | makeAttribute(String name,
String URI,
String value,
Attribute.Type type)
Returns a new
Nodes object containing an
attribute in the specified namespace
with the specified name and type. |
Nodes | makeComment(String data)
Returns a new
Nodes object containing a
comment with the specified text. |
Nodes | makeDocType(String rootElementName,
String publicID,
String systemID)
Returns a new
Nodes object containing a
DocType object with the specified root element
name, system ID, and public ID. |
Nodes | makeProcessingInstruction(String target,
String data)
Returns a new
Nodes object containing a
new ProcessingInstruction object with
the specified target and data. |
Element | makeRootElement(String name,
String namespace)
Creates a new element in the specified namespace
with the specified name.
|
Nodes | makeText(String data)
Returns a new
Nodes object containing a
text node with the specified content. |
Document | startMakingDocument()
Creates a new
Document object. |
Element | startMakingElement(String name,
String namespace)
Creates a new
Element in the specified namespace
with the specified name. |
public Element makeRootElement(String name, String namespace)
Creates a new element in the specified namespace with the specified name. The builder calls this method to make the root element of the document.
Subclasses may change the name, namespace, content, or other
characteristics of the element returned.
The default implementation merely calls
startMakingElement
. However, when subclassing, it
is often useful to be able to easily distinguish between the
root element and a non-root element because the root element
cannot be detached. Therefore, subclasses must not return null
from this method. Doing so will cause a
NullPointerException
.
name
- the qualified name of the elementnamespace
- the namespace URI of the elementpublic Element startMakingElement(String name, String namespace)
Creates a new Element
in the specified namespace
with the specified name.
Subclasses may change the name, namespace, content, or other
characteristics of the Element
returned.
Subclasses may return null to indicate the
Element
should not be created.
However, doing so will only remove the element's start-tag and
end-tag from the result tree. Any content inside the element
will be attached to the element's parent by default, unless it
too is filtered. To remove an entire element, return an empty
Nodes
object from the
finishMakingElement()
method.
name
- the qualified name of the elementnamespace
- the namespace URI of the elementpublic Nodes finishMakingElement(Element element)
Signals the end of an element. This method should return
the Nodes
to be added to the tree.
They need not contain the Element
that
was passed to this method, though most often they will.
By default the Nodes
returned contain
only the built element. However, subclasses may return
a list containing any number of nodes, all of which will be
added to the tree at the current position in the order given by
the list (subject to the usual well-formedness constraints, of
course. For instance, the list should not contain a
DocType
object unless the element is the root
element, and the document does not already have a
DocType
). All of the nodes returned must be
parentless. If this method returns an empty list,
then the element (including all its contents) is not included
in the finished document.
To process an element at a time, override this method in a
subclass so that it functions as a callback. When you're done
processing the Element
, return an empty list so
that it will be removed from the tree and garbage collected.
Be careful not to return an empty list for the root element
though. That is, when the element passed to this method is the
root element, the list returned must contain exactly one
Element
object. The simplest way to check this
is testing if element.getParent() instanceof
Document
.
Do not detach element
or any of its ancestors
while inside this method. Doing so can royally muck up the
build.
element
- the finished Element
public Document startMakingDocument()
Creates a new Document
object.
The root element of this document is initially set to
<root xmlns="https://xom.nu/fakeRoot"/>
.
This is only temporary. As soon as the real root element's
start-tag is read, this element is replaced by the real root.
This fake root should never be exposed.
The builder calls this method at the beginning of each document, before it calls any other method in this class. Thus this is a useful place to perform per-document initialization tasks.
Subclasses may change the root element, content,
or other characteristics of the document
returned. However, this method must not return null
or the builder will throw a ParsingException
.
Document
public void finishMakingDocument(Document document)
Signals the end of a document. The default implementation of this method does nothing. The builder does not call this method if an exception is thrown while building a document.
document
- the completed Document
public Nodes makeAttribute(String name, String URI, String value, Attribute.Type type)
Returns a new Nodes
object containing an
attribute in the specified namespace
with the specified name and type.
Subclasses may change the nodes returned from this method.
They may return a Nodes
object containing any
number of children and attributes which are appended and
added to the current parent element. This Nodes
object may not contain any Document
objects.
All of the nodes returned must be parentless.
Subclasses may return an empty Nodes
to indicate
the attribute should not be created.
name
- the prefixed name of the attributeURI
- the namespace URIvalue
- the attribute valuetype
- the attribute typepublic Nodes makeComment(String data)
Returns a new Nodes
object containing a
comment with the specified text.
Subclasses may change the content or other
characteristics of the comment returned.
Subclasses may change the nodes returned from this method.
They may return a Nodes
object containing any
number of children and attributes which are appended and
added to the current parent element. This Nodes
object should not contain any Document
objects.
All of the nodes returned must be parentless.
Subclasses may return an empty Nodes
to indicate
the comment should not be included in the
finished document.
data
- the complete text content of the commentpublic Nodes makeDocType(String rootElementName, String publicID, String systemID)
Returns a new Nodes
object containing a
DocType
object with the specified root element
name, system ID, and public ID.
Subclasses may change the root element name, public ID,
system ID, or other characteristics of the DocType
returned. Subclasses may change the nodes returned from this
method. They may return a Nodes
object containing
any number of comments and processing instructions which are
appended to the current parent node. This Nodes
object may not contain any Document
,
Element
, Attribute
, or
Text
objects. All of the nodes returned must be
parentless. Subclasses may return an empty Nodes
to
indicate the DocType
should not be included in the
finished document.
rootElementName
- the declared, qualified name
for the root elementpublicID
- the public ID of the external DTD subsetsystemID
- the URL of the external DTD subsetpublic Nodes makeText(String data)
Returns a new Nodes
object containing a
text node with the specified content.
Subclasses may change the content or other characteristics of
the text returned. Subclasses may also change the nodes
returned from this method. They may return a Nodes
object containing any number of nodes which are added or
appended to the current parent node. This Nodes
object must not contain any Document
nodes. All of
the nodes returned must be parentless. Subclasses may return an
empty Nodes
to indicate the text should not be
included in the finished document.
data
- the complete text content of the nodepublic Nodes makeProcessingInstruction(String target, String data)
Returns a new Nodes
object containing a
new ProcessingInstruction
object with
the specified target and data.
Subclasses may change the target, data, or other
characteristics of the ProcessingInstruction
returned. Subclasses may change the nodes returned from this
method. They may return a Nodes
object containing
any number of nodes which are added or
appended to the current parent node. This Nodes
object must not contain any Document
nodes.
If the processing instruction appears in the prolog or epilog
of the document, then it must also not contain any
Element
, Attribute
, or
Text
objects.
All of the nodes returned must be parentless. Subclasses
may return an empty Nodes
to indicate the
processing instruction should not be included in the
finished document.
target
- the target of the processing instructiondata
- the data of the processing instructionCopyright 2002-2023 Elliotte Rusty Harold
elharo@ibiblio.org