org.apache.xml.utils
public class DOMHelper extends Object
Deprecated: Since the introduction of the DTM, this class will be removed. This class provides a front-end to DOM implementations, providing a number of utility functions that either aren't yet standardized by the DOM spec or that are defined in optional DOM modules and hence may not be present in all DOMs.
Method Summary | |
---|---|
static Document | createDocument(boolean isSecureProcessing)
DOM Level 1 did not have a standard mechanism for creating a new
Document object. |
static Document | createDocument()
DOM Level 1 did not have a standard mechanism for creating a new
Document object. |
Document | getDOMFactory()
Retrieve the factory object required to create DOM nodes
in the result tree.
|
Element | getElementByID(String id, Document doc)
Given an ID, return the element. |
String | getExpandedAttributeName(Attr attr)
Returns the attribute name with the namespace prefix (if any) replaced
by the Namespace URI it was bound to. |
String | getExpandedElementName(Element elem)
Returns the element name with the namespace prefix (if any) replaced
by the Namespace URI it was bound to. |
short | getLevel(Node n)
Get the depth level of this node in the tree (equals 1 for
a parentless node).
|
String | getLocalNameOfNode(Node n)
Returns the local name of the given node. |
String | getNamespaceForPrefix(String prefix, Element namespaceContext)
Given an XML Namespace prefix and a context in which the prefix
is to be evaluated, return the Namespace Name this prefix was
bound to. |
String | getNamespaceOfNode(Node n)
Returns the namespace of the given node. |
static String | getNodeData(Node node)
Get the textual contents of the node. |
static void | getNodeData(Node node, FastStringBuffer buf)
Retrieve the text content of a DOM subtree, appending it into a
user-supplied FastStringBuffer object. |
static Node | getParentOfNode(Node node)
Obtain the XPath-model parent of a DOM node -- ownerElement for Attrs,
parent for other nodes.
|
Node | getRoot(Node node)
Get the first unparented node in the ancestor chain. |
Node | getRootNode(Node n)
Get the root node of the document tree, regardless of
whether or not the node passed in is a document node.
|
String | getUniqueID(Node node)
Supports the XPath function GenerateID by returning a unique
identifier string for any given DOM Node.
|
String | getUnparsedEntityURI(String name, Document doc)
The getUnparsedEntityURI function returns the URI of the unparsed
entity with the specified name in the same document as the context
node (see [3.3 Unparsed Entities]). |
boolean | isIgnorableWhitespace(Text node)
Tell if the node is ignorable whitespace. |
boolean | isNamespaceNode(Node n)
Test whether the given node is a namespace decl node. |
static boolean | isNodeAfter(Node node1, Node node2)
Figure out whether node2 should be considered as being later
in the document than node1, in Document Order as defined
by the XPath model. |
static boolean | isNodeTheSame(Node node1, Node node2)
Use DTMNodeProxy to determine whether two nodes are the same.
|
void | setDOMFactory(Document domFactory)
Store the factory object required to create DOM nodes
in the result tree. |
boolean | shouldStripSourceNode(Node textNode)
Tells, through the combination of the default-space attribute
on xsl:stylesheet, xsl:strip-space, xsl:preserve-space, and the
xml:space attribute, whether or not extra whitespace should be stripped
from the node. |
TODO: This isn't directly compatable with DOM Level 2. The Level 2 createDocument call also creates the root element, and thus requires that you know what that element will be before creating the Document. We should think about whether we want to change this code, and the callers, so we can use the DOM's own method. (It's also possible that DOM Level 3 may relax this sequence, but you may give up some intelligence in the DOM by doing so; the intent was that knowing the document type and root element might let the DOM automatically switch to a specialized subclass for particular kinds of documents.)
Parameters: isSecureProcessing state of the secure processing feature.
Returns: The newly created DOM Document object, with no children, or null if we can't find a DOM implementation that permits creating new empty Documents.
Returns: The newly created DOM Document object, with no children, or null if we can't find a DOM implementation that permits creating new empty Documents.
Returns: The result tree's DOM Document Node.
Note that DOM Level 1 had no ability to retrieve this information. DOM Level 2 introduced it but does not promise that it will be supported in all DOMs; those which can't support it will always return null.
TODO: getElementByID is currently unimplemented. Support DOM Level 2?
Parameters: id The unique identifier to be searched for. doc The document to search within.
Returns: CURRENTLY HARDCODED TO NULL, but it should be: The node which has this unique identifier, or null if there is no such node or this DOM can't reliably recognize it.
Parameters: attr Attr to be examined
Returns: String in the form "namespaceURI:localname" if the node belongs to a namespace, or simply "localname" if it doesn't.
See Also: DOMHelper
Parameters: elem Element to be examined.
Returns: String in the form "namespaceURI:localname" if the node belongs to a namespace, or simply "localname" if it doesn't.
See Also: DOMHelper
Parameters: n Node to be examined.
Returns: the number of ancestors, plus one
UNKNOWN: internal
Parameters: n the node to be examined.
Returns: String containing the Local Name
Parameters: prefix String containing namespace prefix to be resolved, without the ':' which separates it from the localname when used in a Node Name. The empty sting signifies the default namespace at this point in the document. namespaceContext Element which provides context for resolution. (We could extend this to work for other nodes by first seeking their nearest Element ancestor.)
Returns: a String containing the Namespace URI which this prefix represents in the specified context.
Parameters: n Node to be examined.
Returns: String containing the Namespace Name (uri) for this node. Note that this is undefined for any nodes other than Elements and Attributes.
Parameters: node DOM Node to be examined
Returns: String containing a concatenation of all the textual content within that node.
There are open questions regarding whitespace stripping. Currently we make no special effort in that regard, since the standard DOM doesn't yet provide DTD-based information to distinguish whitespace-in-element-context from genuine #PCDATA. Note that we should probably also consider xml:space if/when we address this. DOM Level 3 may solve the problem for us.
Parameters: node Node whose subtree is to be walked, gathering the contents of all Text or CDATASection nodes. buf FastStringBuffer into which the contents of the text nodes are to be concatenated.
Background: The DOM believes that you must be your Parent's Child, and thus Attrs don't have parents. XPath said that Attrs do have their owning Element as their parent. This function bridges the difference, either by using the DOM Level 2 ownerElement function or by using a "silly and expensive function" in Level 1 DOMs.
(There's some discussion of future DOMs generalizing ownerElement into ownerNode and making it work on all types of nodes. This still wouldn't help the users of Level 1 or Level 2 DOMs)
Parameters: node Node whose XPath parent we want to obtain
Returns: the parent of the node, or the ownerElement if it's an Attr node, or null if the node is an orphan.
Throws: RuntimeException if the Document has no root element. This can't arise if the Document was created via the DOM Level 2 factory methods, but is possible if other mechanisms were used to obtain it
Deprecated:
Get the first unparented node in the ancestor chain.Parameters: node Starting node, to specify which chain to chase
Returns: the topmost ancestor.
TODO: This doesn't handle DocumentFragments or "orphaned" subtrees -- it's currently returning ownerDocument even when the tree is not actually part of the main Document tree. We should either rewrite the description to say that it finds the Document node, or change the code to walk up the ancestor chain.
Parameters: n Node to be examined
Returns: the Document node. Note that this is not the correct answer if n was (or was a child of) a DocumentFragment or an orphaned node, as can arise if the DOM has been edited rather than being generated by a parser.
Warning: The base implementation uses the Node object's hashCode(), which is NOT guaranteed to be unique. If that method hasn't been overridden in this DOM ipmlementation, most Java implementions will derive it from the object's address and should be OK... but if your DOM uses a different definition of hashCode (eg hashing the contents of the subtree), or if your DOM may have multiple objects that represent a single Node in the data structure (eg via proxying), you may need to find another way to assign a unique identifier.
Also, be aware that if nodes are destroyed and recreated, there is an open issue regarding whether an ID may be reused. Currently we're assuming that the input document is stable for the duration of the XPath/XSLT operation, so this shouldn't arise in this context.
(DOM Level 3 is investigating providing a unique node "key", but that won't help Level 1 and Level 2 implementations.)
Parameters: node whose identifier you want to obtain
Returns: a string which should be different for every Node object.
XML processors may choose to use the System Identifier (if one is provided) to resolve the entity, rather than the URI in the Public Identifier. The details are dependent on the processor, and we would have to support some form of plug-in resolver to handle this properly. Currently, we simply return the System Identifier if present, and hope that it a usable URI or that our caller can map it to one. TODO: Resolve Public Identifiers... or consider changing function name.
If we find a relative URI reference, XML expects it to be resolved in terms of the base URI of the document. The DOM doesn't do that for us, and it isn't entirely clear whether that should be done here; currently that's pushed up to a higher levelof our application. (Note that DOM Level 1 didn't store the document's base URI.) TODO: Consider resolving Relative URIs.
(The DOM's statement that "An XML processor may choose to completely expand entities before the structure model is passed to the DOM" refers only to parsed entities, not unparsed, and hence doesn't affect this function.)
Parameters: name A string containing the Entity Name of the unparsed entity. doc Document node for the document to be searched.
Returns: String containing the URI of the Unparsed Entity, or an empty string if no such entity exists.
Deprecated:
Tell if the node is ignorable whitespace. Note that this can be determined only in the context of a DTD or other Schema, and that DOM Level 2 has nostandardized DOM API which can return that information.Parameters: node Node to be examined
Returns: CURRENTLY HARDCODED TO FALSE, but should return true if and only if the node is of type Text, contains only whitespace, and does not appear as part of the #PCDATA content of an element. (Note that determining this last may require allowing for Entity References.)
Parameters: n Node to be examined.
Returns: boolean -- true iff the node is an Attr whose name is "xmlns" or has the "xmlns:" prefix.
There are some cases where ordering isn't defined, and neither are the results of this function -- though we'll generally return true. TODO: Make sure this does the right thing with attribute nodes!!!
Parameters: node1 DOM Node to perform position comparison on. node2 DOM Node to perform position comparison on .
Returns: false if node2 comes before node1, otherwise return true.
You can think of this as
(node1.documentOrderPosition <= node2.documentOrderPosition)
.
Parameters: node1 The first DOM node to compare. node2 The second DOM node to compare.
Returns: true if the two nodes are the same.
Parameters: domFactory The DOM Document Node within whose context the result tree will be built.
Parameters: textNode A text node from the source tree.
Returns: true if the text node should be stripped of extra whitespace.
Throws: javax.xml.transform.TransformerException
UNKNOWN: advanced