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
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) or
declareNamespace(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
QNameresolution 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
OMTextinstance with aQNamevalue) 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
OMElementorOMAttributenode 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
Modifier and TypeMethodDescriptionaddAttribute(String localName, String value, OMNamespace ns) Adds an attribute to this element.addAttribute(OMAttribute attr) Adds an attribute to this element.Clones this element and its descendants using default options.Add a namespace declaration for the default namespace to this element.declareNamespace(String uri, String prefix) Add a namespace declaration for the given namespace URI to this element, optionally generating a prefix for that namespace.declareNamespace(OMNamespace namespace) Declares a namespace with the element as its scope.findNamespace(String uri, String prefix) Finds a namespace with the given uri and prefix, in the scope of the hierarchy.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.Returns a list of OMAttributes.Returns an iterator for all of the namespaces declared on this element.getAttribute(QName qname) Returns a named attribute if present.getAttributeValue(QName qname) Returns a named attribute's value, if present.Returns a filtered list of children - just the elements.Get the default namespace in scope on this element.getDescendants(boolean includeSelf) Get an iterator over all descendants of the container.Returns the first child element of the element.intDeprecated.getNamespaceContext(boolean detached) Get the namespace context of this element, as determined by the namespace declarations present on this element and its ancestors.Get an iterator that returns all namespaces in scope for this element.getText()Returns the non-empty text children as a string.Resolve the content of this element to aQName.getTextAsStream(boolean cache) Returns a stream representing the concatenation of the text nodes that are children of a this element.voidremoveAttribute(OMAttribute attr) Removes the given attribute from this element.resolveQName(String qname) Resolves a QName literal in the namespace context defined by this element and produces a correspondingQNameobject.voidsetLineNumber(int lineNumber) Deprecated.voidsetNamespace(OMNamespace namespace) Set the namespace for this element.voidsetNamespaceWithNoFindInCurrentScope(OMNamespace namespace) Deprecated.voidSet the content of this element to the given text.voidSet the content of this element to the givenQName.toString()Convenience method to serialize the element to a string with caching enabled.Convenience method to serialize the element to a string without caching.voidundeclarePrefix(String prefix) Add a namespace declaration that undeclares a given prefix.voidwriteTextTo(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, serializeAndConsumeMethods inherited from interface org.apache.axiom.om.OMInformationItem
clone, getOMFactoryMethods inherited from interface org.apache.axiom.om.OMNamedInformationItem
getLocalName, getNamespace, getNamespaceURI, getPrefix, getQName, hasName, setLocalName, setNamespaceMethods inherited from interface org.apache.axiom.om.OMNode
buildWithAttachments, detach, discard, getNextOMSibling, getParent, getPreviousOMSibling, getType, insertSiblingAfter, insertSiblingBeforeMethods inherited from interface org.apache.axiom.om.OMSerializable
build, close, isComplete, serialize, serialize, serializeAndConsume
-
Method Details
-
getChildElements
Returns a filtered list of children - just the elements.- Returns:
- Returns an iterator over the child elements.
- See Also:
-
declareNamespace
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. Ifnullis 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:
-
declareDefaultNamespace
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
nullif no default namespace is in scope. This method never returns anOMNamespaceobject with an empty namespace URI; if the element or one of its ancestors has axmlns=""declaration, thennullis returned. Note that if the method returns anOMNamespaceobject, then its prefix will obviously be the empty string.
-
declareNamespace
Declares a namespace with the element as its scope.- Parameters:
namespace- The namespace to declare. If the prefix specified by theOMNamespaceobject isnull, then a prefix will be generated.- Returns:
- The declared namespace, which will be equal to the
OMNamespaceobject 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:
-
undeclarePrefix
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 anOMNamespaceobject for whichOMNamespace.getNamespaceURI()returns an empty string.- Parameters:
prefix- the prefix to undeclare
-
findNamespace
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
prefixorurishould be null. Results are undefined if both are specified.- Parameters:
uri- The namespace to look for. If this is specified,prefixshould be null.prefix- The prefix to look for. If this is specified,urishould be null.- Returns:
- Returns the matching namespace declaration, or
nullif none was found. - See Also:
-
findNamespaceURI
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
OMNamespaceitems 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 oneOMNamespaceobject with that prefix, and this object specifies the namespace URI bound to the prefix. The iterator returns anOMNamespaceobject with an empty prefix if and only if there is a default namespace. It will never return anOMNamespaceobject 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
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
NamespaceContextimplementation 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
NamespaceContextis cheaper, but the lookup performance of a detachedNamespaceContextis better. The detached variant should always be used if the reference to theNamespaceContextis kept longer than the object model itself, because in this case a liveNamespaceContextwould prevent the object model from being garbage collected.- Parameters:
detached-trueif the method should return a detached implementation,falseif 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
addAttributecall.- Returns:
- An iterator over the
OMAttributeitems associated with the element. If the element has no attributes, an empty iterator is returned. - See Also:
-
getAttribute
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
Returns a named attribute's value, if present.- Parameters:
qname- the qualified name to search for- Returns:
- The attribute value, or
nullif no matching attribute is found.
-
addAttribute
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
attrparameter 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
attris 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
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
OMAttributeinstance 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. TheOMNamespacemay have anullprefix, 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
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
nullif none was found.
-
setText
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 typeOMTextafter the method returns. If the parameter isnullor an empty string, then the element will have no children.- Parameters:
text- the new text content for the element
-
setText
Set the content of this element to the givenQName. If no matching namespace declaration for theQNameis in scope, then this method will add one. If theQNamespecifies 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 typeOMTextafter 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
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.cacheisfalseor the element is anOMSourcedElementthat is backed by a non destructiveOMDataSource. - The underlying parser (or the implementation of the underlying
XMLStreamReaderin 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
cacheset tofalsethe 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:
- The method is not required to cache the content of the
-
writeTextTo
Write the content of the text nodes that are children of a given element to aWriter. Ifcacheis 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:
-
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
nullif the element is empty or the QName could not be resolved
-
setNamespace
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)withdeclareset totrue.- Parameters:
namespace- The new namespace for this element, ornullto remove the namespace from this element. If anOMNamespaceinstance with anullprefix 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
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 andOMTextnodes 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
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
Resolves a QName literal in the namespace context defined by this element and produces a correspondingQNameobject. 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
QNameobject, ornullif 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
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:
getDescendantsin interfaceOMContainer- Parameters:
includeSelf-trueif the iterator should also return the container itself;falseif the first item returned by the iterator should be the first child of the container- Returns:
- an iterator over the descendants of this container
-
OMNamedInformationItem.setNamespace(OMNamespace, boolean)withdeclareset tofalse.