Interface OMElement
-
- All Superinterfaces:
OMContainer
,OMInformationItem
,OMNamedInformationItem
,OMNode
,OMSerializable
- All Known Subinterfaces:
OMSourcedElement
,SOAPBody
,SOAPEnvelope
,SOAPFault
,SOAPFaultClassifier
,SOAPFaultCode
,SOAPFaultDetail
,SOAPFaultNode
,SOAPFaultReason
,SOAPFaultRole
,SOAPFaultSubCode
,SOAPFaultText
,SOAPFaultValue
,SOAPHeader
,SOAPHeaderBlock
public interface OMElement extends OMNode, OMContainer, OMNamedInformationItem
A particular kind of node that represents an element infoset information item.An element has a collection of children, attributes, and namespace declarations. In contrast with DOM, this interface exposes namespace declarations separately from the attributes.
Namespace declarations are either added explicitly using
declareNamespace(String, String)
,declareDefaultNamespace(String)
ordeclareNamespace(OMNamespace)
, or are created implicitly as side effect of other method calls:- If the element is created with a namespace and no matching namespace declaration is in scope
in the location in the tree where the element is created, then an appropriate namespace
declaration will be automatically added to the newly created element. The exact rules depend on
the method chosen to create the element; see for example
OMFactory.createOMElement(QName)
. - If an attribute with a namespace is added, but no matching namespace declaration is in scope
in the element, one is automatically added. See
addAttribute(OMAttribute)
for more details.
Fortunately, loosing namespace well-formedness has only very limited impact:
- If namespace well-formedness is lost, the string to
QName
resolution for attribute values and element content may be inconsistent, i.e.resolveQName(String)
,getTextAsQName()
andOMText.getTextAsQName()
may return incorrect results. However, it should be noted that these methods are most relevant for object model instances that have been loaded from existing documents or messages. These object models are guaranteed to be well-formed with respect to namespaces (unless they have been modified after loading). - During serialization, Axiom will automatically repair any namespace inconsistencies. It will
add necessary namespace declarations to the output document where they are missing in the object
model and generate modified namespace declarations where the original ones in the object model
are inconsistent. It will also omit redundant namespace declarations. Axiom guarantees that in
the output document, every element and attribute (and
OMText
instance with aQName
value) will have the same namespace URI as in the object model, thus preserving the intended semantics of the document. On the other hand, the namespace prefixes used in the output document may differ from the ones in the object model. - More precisely, Axiom will always make sure that any
OMElement
orOMAttribute
node will keep the namespace URI that has been assigned to the node at creation time, unless the namespace is explicitly changed usingsetNamespace(OMNamespace)
orOMNamedInformationItem.setNamespace(OMNamespace, boolean)
.
-
-
Field Summary
-
Fields inherited from interface org.apache.axiom.om.OMNode
CDATA_SECTION_NODE, COMMENT_NODE, DTD_NODE, ELEMENT_NODE, ENTITY_REFERENCE_NODE, PI_NODE, SPACE_NODE, TEXT_NODE
-
-
Method Summary
All Methods Instance Methods Abstract Methods Deprecated Methods Modifier and Type Method Description OMAttribute
addAttribute(String localName, String value, OMNamespace ns)
Adds an attribute to this element.OMAttribute
addAttribute(OMAttribute attr)
Adds an attribute to this element.OMElement
cloneOMElement()
Clones this element and its descendants using default options.OMNamespace
declareDefaultNamespace(String uri)
Add a namespace declaration for the default namespace to this element.OMNamespace
declareNamespace(String uri, String prefix)
Add a namespace declaration for the given namespace URI to this element, optionally generating a prefix for that namespace.OMNamespace
declareNamespace(OMNamespace namespace)
Declares a namespace with the element as its scope.OMNamespace
findNamespace(String uri, String prefix)
Finds a namespace with the given uri and prefix, in the scope of the hierarchy.OMNamespace
findNamespaceURI(String prefix)
Checks for a namespace in the context of this element with the given prefix and returns the relevant namespace object, if available.Iterator<OMAttribute>
getAllAttributes()
Returns a list of OMAttributes.Iterator<OMNamespace>
getAllDeclaredNamespaces()
Returns an iterator for all of the namespaces declared on this element.OMAttribute
getAttribute(QName qname)
Returns a named attribute if present.String
getAttributeValue(QName qname)
Returns a named attribute's value, if present.Iterator<OMElement>
getChildElements()
Returns a filtered list of children - just the elements.OMNamespace
getDefaultNamespace()
Get the default namespace in scope on this element.Iterator<OMNode>
getDescendants(boolean includeSelf)
Get an iterator over all descendants of the container.OMElement
getFirstElement()
Returns the first child element of the element.int
getLineNumber()
Deprecated.NamespaceContext
getNamespaceContext(boolean detached)
Get the namespace context of this element, as determined by the namespace declarations present on this element and its ancestors.Iterator<OMNamespace>
getNamespacesInScope()
Get an iterator that returns all namespaces in scope for this element.String
getText()
Returns the non-empty text children as a string.QName
getTextAsQName()
Resolve the content of this element to aQName
.Reader
getTextAsStream(boolean cache)
Returns a stream representing the concatenation of the text nodes that are children of a this element.void
removeAttribute(OMAttribute attr)
Removes the given attribute from this element.QName
resolveQName(String qname)
Resolves a QName literal in the namespace context defined by this element and produces a correspondingQName
object.void
setLineNumber(int lineNumber)
Deprecated.void
setNamespace(OMNamespace namespace)
Set the namespace for this element.void
setNamespaceWithNoFindInCurrentScope(OMNamespace namespace)
Deprecated.void
setText(String text)
Set the content of this element to the given text.void
setText(QName qname)
Set the content of this element to the givenQName
.String
toString()
Convenience method to serialize the element to a string with caching enabled.String
toStringWithConsume()
Convenience method to serialize the element to a string without caching.void
undeclarePrefix(String prefix)
Add a namespace declaration that undeclares a given prefix.void
writeTextTo(Writer out, boolean cache)
Write the content of the text nodes that are children of a given element to aWriter
.-
Methods inherited from interface org.apache.axiom.om.OMContainer
addChild, getBuilder, getChildren, getChildrenWithLocalName, getChildrenWithName, getChildrenWithNamespaceURI, getFirstChildWithName, getFirstOMChild, getSAXResult, getSAXSource, getXMLStreamReader, getXMLStreamReader, getXMLStreamReader, getXMLStreamReaderWithoutCaching, getXOPEncodedStreamReader, removeChildren, serialize, serialize, serialize, serialize, serialize, serialize, serialize, serialize, serializeAndConsume, serializeAndConsume, serializeAndConsume, serializeAndConsume
-
Methods inherited from interface org.apache.axiom.om.OMInformationItem
clone, getOMFactory
-
Methods inherited from interface org.apache.axiom.om.OMNamedInformationItem
getLocalName, getNamespace, getNamespaceURI, getPrefix, getQName, hasName, setLocalName, setNamespace
-
Methods inherited from interface org.apache.axiom.om.OMNode
buildWithAttachments, detach, discard, getNextOMSibling, getParent, getPreviousOMSibling, getType, insertSiblingAfter, insertSiblingBefore
-
Methods inherited from interface org.apache.axiom.om.OMSerializable
build, close, isComplete, serialize, serialize, serializeAndConsume
-
-
-
-
Method Detail
-
getChildElements
Iterator<OMElement> getChildElements()
Returns a filtered list of children - just the elements.- Returns:
- Returns an iterator over the child elements.
- See Also:
OMContainer.getChildren()
,OMContainer.getChildrenWithName(javax.xml.namespace.QName)
-
declareNamespace
OMNamespace declareNamespace(String uri, String prefix)
Add a namespace declaration for the given namespace URI to this element, optionally generating a prefix for that namespace.- Parameters:
uri
- The namespace to declare in the current scope. The caller is expected to ensure that the URI is a valid namespace name.prefix
- The prefix to associate with the given namespace. The caller is expected to ensure that this is a valid XML prefix. Ifnull
is given, a prefix will be auto-generated.- Returns:
- the created namespace information item
- Throws:
IllegalArgumentException
- if an attempt is made to bind a prefix to the empty namespace name- See Also:
declareNamespace(OMNamespace)
,findNamespace(String, String)
,getAllDeclaredNamespaces()
-
declareDefaultNamespace
OMNamespace declareDefaultNamespace(String uri)
Add a namespace declaration for the default namespace to this element.Note that this method will never change the namespace of the element itself. If an attempt is made to add a namespace declaration that conflicts with the namespace information of the element, an exception is thrown.
- Parameters:
uri
- The default namespace to declare in the current scope. The caller is expected to ensure that the URI is a valid namespace name.- Returns:
- the created namespace information item
- Throws:
OMException
- if an attempt is made to add a conflicting namespace declaration
-
getDefaultNamespace
OMNamespace getDefaultNamespace()
Get the default namespace in scope on this element.- Returns:
- The default namespace or
null
if no default namespace is in scope. This method never returns anOMNamespace
object with an empty namespace URI; if the element or one of its ancestors has axmlns=""
declaration, thennull
is returned. Note that if the method returns anOMNamespace
object, then its prefix will obviously be the empty string.
-
declareNamespace
OMNamespace declareNamespace(OMNamespace namespace)
Declares a namespace with the element as its scope.- Parameters:
namespace
- The namespace to declare. If the prefix specified by theOMNamespace
object isnull
, then a prefix will be generated.- Returns:
- The declared namespace, which will be equal to the
OMNamespace
object passed as parameter, except if the prefix wasnull
, in which case the return value contains the generated prefix. - Throws:
IllegalArgumentException
- if an attempt is made to bind a prefix to the empty namespace name- See Also:
declareNamespace(String, String)
,findNamespace(String, String)
,getAllDeclaredNamespaces()
-
undeclarePrefix
void undeclarePrefix(String prefix)
Add a namespace declaration that undeclares a given prefix. Prefix undeclaring is supported in XML 1.1, but forbidden in XML 1.0. If an object model on which this method has been used is later serialized to an XML 1.0 document, an error will occur. When serialized to an XML 1.1 document, a namespace declaration in the formxmlns:p=""
will be produced.A namespace declaration with empty namespace name will be added even if no existing namespace declaration for the given prefix is in scope in the context of the current element. If a namespace declaration for the given prefix is already defined on this element, it will be replaced.
The namespace declaration created by this method will be returned by
getAllDeclaredNamespaces()
. It is represented as anOMNamespace
object for whichOMNamespace.getNamespaceURI()
returns an empty string.- Parameters:
prefix
- the prefix to undeclare
-
findNamespace
OMNamespace findNamespace(String uri, String prefix)
Finds a namespace with the given uri and prefix, in the scope of the hierarchy.Searches from the current element and goes up the hiararchy until a match is found. If no match is found, returns
null
.Either
prefix
oruri
should be null. Results are undefined if both are specified.- Parameters:
uri
- The namespace to look for. If this is specified,prefix
should be null.prefix
- The prefix to look for. If this is specified,uri
should be null.- Returns:
- Returns the matching namespace declaration, or
null
if none was found. - See Also:
declareNamespace(String, String)
,declareNamespace(OMNamespace)
,getAllDeclaredNamespaces()
-
findNamespaceURI
OMNamespace findNamespaceURI(String prefix)
Checks for a namespace in the context of this element with the given prefix and returns the relevant namespace object, if available. If not available, returns null.- Parameters:
prefix
-
-
getAllDeclaredNamespaces
Iterator<OMNamespace> getAllDeclaredNamespaces()
Returns an iterator for all of the namespaces declared on this element. Note that this is not the same as the set of namespace declarations in scope. Since building a namespace context and resolving namespace prefixes has some subtleties associated with it (such as masked namespace declarations and prefix undeclaring), it is generally recommended to use one of the following specialized methods for this purpose:getNamespacesInScope()
orgetNamespaceContext(boolean)
to calculate the namespace context for the element.findNamespace(String, String)
andfindNamespaceURI(String)
to resolve a namespace prefix or to find a namespace prefix for a given URI.resolveQName(String)
to resolve a QName literal.AXIOMXPath(OMElement, String)
orAXIOMXPath(OMAttribute)
to create an XPath expression using the namespace context of a given element.
It is expected that applications only rarely use
getAllDeclaredNamespaces()
directly.The iterator returned by this method supports
Iterator.remove()
and that method can be used to remove a namespace declaration from this element.- Returns:
- An iterator over the
OMNamespace
items declared on this element. If the element has no namespace declarations, an empty iterator is returned.Note that the returned iterator may be invalidated by a call to
declareNamespace(OMNamespace)
,declareNamespace(String, String)
,declareDefaultNamespace(String)
or any other method that modifies the namespace declarations of this element.
-
getNamespacesInScope
Iterator<OMNamespace> getNamespacesInScope()
Get an iterator that returns all namespaces in scope for this element. This method may be used to determine the namespace context for this element. For any given prefix, the iterator returns at most oneOMNamespace
object with that prefix, and this object specifies the namespace URI bound to the prefix. The iterator returns anOMNamespace
object with an empty prefix if and only if there is a default namespace. It will never return anOMNamespace
object with both the prefix and the namespace URI set to the empty string, even if the element or one of its ancestors has a namespace declaration of the formxmlns=""
.The order in which the iterator returns the namespaces is undefined, and invoking the
Iterator.remove()
method on the returned iterator is not supported. The iterator may be a "live" object, which means that results are undefined if the document is modified (in a way that would modify the namespace context for the element) while the iterator is in use.- Returns:
- an iterator over all namespaces in scope for this element
-
getNamespaceContext
NamespaceContext getNamespaceContext(boolean detached)
Get the namespace context of this element, as determined by the namespace declarations present on this element and its ancestors.The method supports two different
NamespaceContext
implementation variants:- A "live" variant that keeps a reference to the element and that performs lookups by
accessing the object model. This means that any change in the object model will automatically
be reflected by the
NamespaceContext
. - A "detached" variant that stores a snapshot of the namespace context and that doesn't have any reference to the object model.
Typically, creating a live
NamespaceContext
is cheaper, but the lookup performance of a detachedNamespaceContext
is better. The detached variant should always be used if the reference to theNamespaceContext
is kept longer than the object model itself, because in this case a liveNamespaceContext
would prevent the object model from being garbage collected.- Parameters:
detached
-true
if the method should return a detached implementation,false
if the method should return a live object- Returns:
- The namespace context for this element. Note that the caller must not make any assumption about the actual implementation class returned by this method.
- A "live" variant that keeps a reference to the element and that performs lookups by
accessing the object model. This means that any change in the object model will automatically
be reflected by the
-
getAllAttributes
Iterator<OMAttribute> getAllAttributes()
Returns a list of OMAttributes.Note that the iterator returned by this function will be invalidated by any
addAttribute
call.- Returns:
- An iterator over the
OMAttribute
items associated with the element. If the element has no attributes, an empty iterator is returned. - See Also:
getAttribute(javax.xml.namespace.QName)
,addAttribute(OMAttribute)
,addAttribute(String, String, OMNamespace)
-
getAttribute
OMAttribute getAttribute(QName qname)
Returns a named attribute if present.- Parameters:
qname
- the qualified name to search for- Returns:
- Returns an OMAttribute with the given name if found, or null
-
getAttributeValue
String getAttributeValue(QName qname)
Returns a named attribute's value, if present.- Parameters:
qname
- the qualified name to search for- Returns:
- The attribute value, or
null
if no matching attribute is found.
-
addAttribute
OMAttribute addAttribute(OMAttribute attr)
Adds an attribute to this element.If the attribute already has an owner, the attribute is cloned (i.e. its name, value and namespace are copied to a new attribute) and the new attribute is added to the element. Otherwise the existing instance specified by the
attr
parameter is added to the element. In both cases the owner of the added attribute is set to be the particularOMElement
.If there is already an attribute with the same name and namespace URI, it will be replaced and its owner set to
null
.In the particular case where the attribute specified by
attr
is already owned by the element, calling this method has no effect.Attributes are not stored in any particular order. In particular, there is no guarantee that the added attribute will be returned as the last item by the iterator produced by a subsequent call to
getAllAttributes()
.If the attribute being added has a namespace, but no corresponding namespace declaration is in scope for the element (i.e. declared on the element or one of its ancestors), a new namespace declaration is added to the element. Note that both the namespace prefix and URI are taken into account when looking for an existing namespace declaration.
- Parameters:
attr
- The attribute to add.- Returns:
- The attribute that was added to the element. As described above this may or may
not be the same as
attr
, depending on whether the attribute specified by this parameter already has an owner or not.
-
addAttribute
OMAttribute addAttribute(String localName, String value, OMNamespace ns)
Adds an attribute to this element.If the element already has an attribute with the same local name and namespace URI, then this existing attribute will be removed from the element, i.e. this method will always create a new
OMAttribute
instance and never update an existing one.- Parameters:
localName
- The local name for the attribute.value
- The string value of the attribute. This function does not check to make sure that the given attribute value can be serialized directly as an XML value. The caller may, for example, pass a string with the character 0x01.ns
- The namespace for the attribute. If no corresponding namespace declaration is in scope, then a new namespace declaration will be added to the element. TheOMNamespace
may have anull
prefix, in which case the method will generate a prefix (if no namespace declaration for the given namespace URI is in scope) or use an existing one.- Returns:
- Returns the added attribute.
- Throws:
IllegalArgumentException
- if an attempt is made to create a prefixed attribute with an empty namespace name or an unprefixed attribute with a namespace
-
removeAttribute
void removeAttribute(OMAttribute attr)
Removes the given attribute from this element.- Parameters:
attr
- the attribute to remove- Throws:
OMException
- if the attribute is not owned by this element
-
getFirstElement
OMElement getFirstElement()
Returns the first child element of the element.- Returns:
- Returns the first child element of the element, or
null
if none was found.
-
setText
void setText(String text)
Set the content of this element to the given text. If the element has children, then all these children are detached before the content is set. If the parameter is a non empty string, then the element will have a single child of typeOMText
after the method returns. If the parameter isnull
or an empty string, then the element will have no children.- Parameters:
text
- the new text content for the element
-
setText
void setText(QName qname)
Set the content of this element to the givenQName
. If no matching namespace declaration for theQName
is in scope, then this method will add one. If theQName
specifies a namespace URI but no prefix, then a prefix will be generated. If the element has children, then all these children are detached before the content is set. If the parameter is notnull
, then the element will have a single child of typeOMText
after the method returns. If the parameter isnull
, then the element will have no children.- Parameters:
qname
- the QName value
-
getText
String getText()
Returns the non-empty text children as a string.This method iterates over all the text children of the element and concatenates them to a single string. Only direct children will be considered, i.e. the text is not extracted recursively. For example the return value for
<element>A<child>B</child>C</element>
will beAC
.All whitespace will be preserved.
- Returns:
- A string representing the concatenation of the child text nodes. If there are no child text nodes, an empty string is returned.
-
getTextAsStream
Reader getTextAsStream(boolean cache)
Returns a stream representing the concatenation of the text nodes that are children of a this element. The stream returned by this method produces exactly the same character sequence as the the stream created by the following expression:new StringReader(element.getText())
The difference is that the stream implementation returned by this method is optimized for performance and is guaranteed to have constant memory usage, provided that:
- The method is not required to cache the content of the
OMElement
, i.e.cache
isfalse
or the element is anOMSourcedElement
that is backed by a non destructiveOMDataSource
. - The underlying parser (or the implementation of the underlying
XMLStreamReader
in the case of anOMSourcedElement
) is non coalescing. Note that this is not the default in Axiom and it may be necessary to configure the parser withStAXParserConfiguration.NON_COALESCING
.
When this method is used with
cache
set tofalse
the caller must close the returned stream before attempting to access other nodes in the tree.- Parameters:
cache
- whether to enable caching when accessing the element- Returns:
- a stream representing the concatenation of the text nodes
- See Also:
getText()
- The method is not required to cache the content of the
-
writeTextTo
void writeTextTo(Writer out, boolean cache) throws IOException
Write the content of the text nodes that are children of a given element to aWriter
. Ifcache
is true, this method has the same effect as the following instruction:out.write(element.getText())
The difference is that this method is guaranteed to have constant memory usage and is optimized for performance (with the same restrictions that apply to
getTextAsStream(boolean)
).The method does not call
Writer.close()
.- Parameters:
out
- the stream to write the content tocache
- whether to enable caching when accessing the element- Throws:
OMException
- if an error occurs when reading from the elementIOException
- if an error occurs when writing to the stream- See Also:
getText()
-
getTextAsQName
QName getTextAsQName()
Resolve the content of this element to aQName
. The QName is interpreted in a way that is compatible with the XML schema specification. In particular, surrounding whitespace is ignored.- Returns:
- the resolved QName, or
null
if the element is empty or the QName could not be resolved
-
setNamespace
void setNamespace(OMNamespace namespace)
Set the namespace for this element. In addition to changing the namespace URI and prefix of the element information item, this method ensures that a corresponding namespace declaration exists. If no corresponding namespace declaration is already in scope, then a new one will be added to this element.This method has the same effect as
OMNamedInformationItem.setNamespace(OMNamespace, boolean)
withdeclare
set totrue
.- Parameters:
namespace
- The new namespace for this element, ornull
to remove the namespace from this element. If anOMNamespace
instance with anull
prefix is given, then a prefix will be generated automatically. In this case, the generated prefix can be determined usingOMNamedInformationItem.getNamespace()
.- Throws:
IllegalArgumentException
- if an attempt is made to bind a prefix to the empty namespace name
-
setNamespaceWithNoFindInCurrentScope
void setNamespaceWithNoFindInCurrentScope(OMNamespace namespace)
Deprecated.
-
toString
String toString()
Convenience method to serialize the element to a string with caching enabled. Caching means that the object model tree for the element will be fully built in memory and can be accessed after invoking this method.This method produces the same result as
OMContainer.serialize(Writer)
. In particular, the element is always serialized as plain XML andOMText
nodes containing optimized binary data are always inlined using base64 encoding. Since the output is accumulated into a single string object, this may result in high memory consumption. Therefore this method should be used with care.
-
toStringWithConsume
String toStringWithConsume() throws XMLStreamException
Convenience method to serialize the element to a string without caching. This method will not built the object model tree in memory. This means that an attempt to access the object model after invoking this method may result in an error (unless the object model was already fully built before, e.g. because it was created programmatically).As for
toString()
, this method may cause high memory consumption for object model trees containing optimized binary data and should therefore be used with care.- Returns:
- the serialized object model
- Throws:
XMLStreamException
-
resolveQName
QName resolveQName(String qname)
Resolves a QName literal in the namespace context defined by this element and produces a correspondingQName
object. The implementation uses the algorithm defined by the XML Schema specification. In particular, the namespace for an unprefixed QName is the default namespace (not the null namespace), i.e. QNames are resolved in the same way as element names.- Parameters:
qname
- the QName literal to resolve- Returns:
- the
QName
object, ornull
if the QName can't be resolved, i.e. if the prefix is not bound in the namespace context of this element
-
cloneOMElement
OMElement cloneOMElement()
Clones this element and its descendants using default options. This method has the same effect asOMInformationItem.clone(OMCloneOptions)
with default options.- Returns:
- the cloned element
-
setLineNumber
void setLineNumber(int lineNumber)
Deprecated.
-
getLineNumber
int getLineNumber()
Deprecated.
-
getDescendants
Iterator<OMNode> getDescendants(boolean includeSelf)
Get an iterator over all descendants of the container. The items are returned in document order. Note that attributes and namespace declarations are not considered descendants.- Specified by:
getDescendants
in interfaceOMContainer
- Parameters:
includeSelf
-true
if the iterator should also return the container itself;false
if the first item returned by the iterator should be the first child of the container- Returns:
- an iterator over the descendants of this container
-
-