Shorthand for filterChildElems(p)
.
Shorthand for attributeOption(expandedName)
.
Shorthand for attributeOption(expandedName)
.
Shorthand for filterElemsOrSelf(p)
.
Shorthand for findTopmostElemsOrSelf(p)
.
Returns the value of the attribute with the given expanded name, and throws an exception otherwise.
Returns the value of the attribute with the given expanded name, and throws an exception otherwise.
Returns the value of the attribute with the given expanded name, if any, wrapped in an Option
.
Returns the value of the attribute with the given expanded name, if any, wrapped in an Option
.
Returns the base URI, falling back to the empty URI if absent.
Returns the optional base URI, computed from the document URI, if any, and the XML base attributes of the ancestors, if any.
Returns the optional base URI, computed from the document URI, if any, and the XML base attributes of the ancestors, if any.
Returns the document URI, falling back to the empty URI if absent.
The optional document URI of the containing document, if any
The optional document URI of the containing document, if any
The underlying element, of the underlying element type.
The underlying element, of the underlying element type. It must be equal to:
rootElem.getElemOrSelfByPath(path)
Returns the child elements obeying the given predicate.
Returns the descendant elements obeying the given predicate.
Returns the descendant-or-self elements obeying the given predicate.
Returns the descendant-or-self elements obeying the given predicate. This method could be defined as:
def filterElemsOrSelf(p: E => Boolean): immutable.IndexedSeq[E] = Vector(this).filter(p) ++ (this.findAllChildElems flatMap (_.filterElemsOrSelf(p)))
It can be proven that the result is equivalent to findAllElemsOrSelf filter p
.
Core method that returns all child elements, in the correct order.
Core method that returns all child elements, in the correct order. Other operations can be defined in terms of this one.
Returns all child elements paired with their path entries.
Returns all child elements paired with their path entries.
This method is final, so more efficient implementations for sub-types are not supported. This implementation is only efficient if finding all child elements as well as computing their resolved names is efficient. That is not the case for DOM wrappers or Scala XML Elem wrappers (due to their expensive Scope computations). On the other hand, those wrapper element implementations are convenient, but not intended for heavy use in production. Hence, this method should typically be fast enough.
Returns all descendant elements (not including this element).
Returns this element followed by all descendant elements (that is, the descendant-or-self elements).
Returns the first found attribute value of an attribute with the given local name, if any, wrapped in an Option
.
Returns the first found attribute value of an attribute with the given local name, if any, wrapped in an Option
.
Because of differing namespaces, it is possible that more than one such attribute exists, although this is not often the case.
Returns the first found child element obeying the given predicate, if any, wrapped in an Option
.
Finds the child element with the given Path.Entry
(where this element is the root), if any, wrapped in an Option
.
Finds the child element with the given Path.Entry
(where this element is the root), if any, wrapped in an Option
.
This method is final, so more efficient implementations for sub-types are not supported. This implementation is only efficient if finding all child elements as well as computing their resolved names is efficient. That is not the case for DOM wrappers or Scala XML Elem wrappers (due to their expensive Scope computations). On the other hand, those wrapper element implementations are convenient, but not intended for heavy use in production. Hence, this method should typically be fast enough.
Returns the first found (topmost) descendant element obeying the given predicate, if any, wrapped in an Option
.
Returns the first found (topmost) descendant-or-self element obeying the given predicate, if any, wrapped in an Option
.
Finds the element with the given Path
(where this element is the root), if any, wrapped in an Option
.
Finds the element with the given Path
(where this element is the root), if any, wrapped in an Option
.
That is, returns:
findReverseAncestryOrSelfByPath(path).map(_.last)
Note that for each non-empty Path, we have:
findElemOrSelfByPath(path) == findChildElemByPathEntry(path.firstEntry) flatMap (e => e.findElemOrSelfByPath(path.withoutFirstEntry))
Finds the reversed ancestry-or-self of the element with the given Path
(where this element is the root),
wrapped in an Option.
Finds the reversed ancestry-or-self of the element with the given Path
(where this element is the root),
wrapped in an Option. None is returned if no element can be found at the given Path.
Hence, the resulting element collection, if any, starts with this element and ends with the element at the given Path, relative to this element.
This method comes in handy for (efficiently) computing base URIs, where the (reverse) ancestry-or-self is needed as input.
Returns the descendant elements obeying the given predicate that have no ancestor obeying the predicate.
Returns the descendant-or-self elements obeying the given predicate, such that no ancestor obeys the predicate.
Returns the descendant-or-self elements obeying the given predicate, such that no ancestor obeys the predicate. This method could be defined as:
def findTopmostElemsOrSelf(p: E => Boolean): immutable.IndexedSeq[E] = if (p(this)) Vector(this) else (this.findAllChildElems flatMap (_.findTopmostElemsOrSelf(p)))
Returns the single child element obeying the given predicate, and throws an exception otherwise.
Returns (the equivalent of) findChildElemByPathEntry(entry).get
Returns (the equivalent of) findChildElemByPathEntry(entry).get
Returns (the equivalent of) findElemOrSelfByPath(path).get
Returns (the equivalent of) findElemOrSelfByPath(path).get
Returns (the equivalent of) findReverseAncestryOrSelfByPath(path).get
Returns (the equivalent of) findReverseAncestryOrSelfByPath(path).get
The local name, that is, the local part of the EName
The local name, that is, the local part of the EName
Returns XmlStringUtils.normalizeString(text)
.
Returns XmlStringUtils.normalizeString(text)
.
The path of this element, relative to the root element
The path of this element, relative to the root element
The resolved attributes of the element as mapping from ENames to values
The resolved attributes of the element as mapping from ENames to values
The EName of the element
The EName of the element
Returns the ENames of the ancestry reversed, starting with the root element and ending with the parent of this element, if any.
Returns the ENames of the ancestry reversed, starting with the root element and ending with the parent of this element, if any.
That is, returns:
reverseAncestryOrSelfENames.dropRight(1)
Returns the reversed ancestor-or-self elements.
Returns the reversed ancestor-or-self elements. That is, returns:
rootElem.findReverseAncestryOrSelfByPath(path).get
Returns the ENames of the ancestry-or-self reversed, starting with the root element and ending with this element.
Returns the ENames of the ancestry-or-self reversed, starting with the root element and ending with this element.
That is, returns:
rootElem.resolvedName +: path.entries.map(_.elementName)
This is equal to:
reverseAncestryOrSelf.map(_.resolvedName)
The root element of the underlying element type
The root element of the underlying element type
Returns the concatenation of the text values of (the implicit) text children, including whitespace and CData.
Returns the concatenation of the text values of (the implicit) text children, including whitespace and CData. Non-text children are ignored. If there are no text children, the empty string is returned.
Therefore, element children are ignored and do not contribute to the resulting text string.
Returns text.trim
.
Returns text.trim
.
An element within its context. In other words, an element as a pair containing the root element (of an underlying element type) and a path (from that root element) to this element. More precisely, this element implementation contains an underlying root element, a Path, and an underlying element found from the root element following the Path. It also contains an optional URI of the containing document, if any.
See the documentation of the mixed-in query API trait(s) for more details on the uniform query API offered by this class.
An
IndexedClarkElem(rootElem)
can be seen as one immutable snapshot of an XML tree. All queries (using theElemApi
uniform query API) on that snapshot return results within the same snapshot. Take care not to mix up query results from different snapshots. (This could have been modeled in an alternative design of the class, using a member type, but such a design has not been chosen.)Using IndexedClarkElem objects, it is easy to get the ancestry or siblings of an element, as elements of the underlying element type.
Be careful not to create any memory leaks. After all, an element, even a leaf element, typically keeps the entire underlying document element tree as state. Hence the underlying document element tree will always remain in memory if at least one indexed element contains it in its state. (Yet with mutable org.w3c.dom element trees, it is also easy to cause memory leaks. See http://apmblog.compuware.com/2011/04/20/the-top-java-memory-problems-part-1/.)
Having an IndexedClarkElem, it is always possible to re-create the root element as IndexedClarkElem, because the underlying root element is always available. On the other hand, creating an IndexedClarkElem is expensive. Class IndexedClarkElem is optimized for fast querying, at the expense of costly recursive creation.
The optional parent base URI is stored for very fast (optional) base URI computation. This is helpful in an XBRL context, where URI resolution against a base URI is typically a very frequent operation.
IndexedClarkElem examples
The following example code shows how to query for elements with a known ancestry, regardless of the element implementation, if efficiency is not important:
IndexedClarkElem more formally
In order to use this class, this more formal section can safely be skipped.
The
class can be understood in a precise mathematical sense, as shown below.IndexedClarkElem
Some properties of IndexedClarkElems are as follows:
The correspondence between queries on IndexedClarkElems and the same queries on the underlying elements is as follows:
Analogous properties hold for the other query methods.
The underlying element type