4 * Copyright 2010 Codist Monk.
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 package net
.sourceforge
.aprog
.markups
;
27 import static net
.sourceforge
.aprog
.tools
.Tools
.*;
29 import net
.sourceforge
.aprog
.tools
.IllegalInstantiationException
;
30 import net
.sourceforge
.aprog
.xml
.XMLTools
;
31 import org
.w3c
.dom
.Node
;
32 import org
.w3c
.dom
.NodeList
;
36 * @author codistmonk (creation 2010-07-04)
38 public final class MarkupsXMLTools
{
41 * @throws IllegalInstantiationException To prevent instantiation
43 private MarkupsXMLTools() {
44 throw new IllegalInstantiationException();
54 public static final String
getIdentifyingXPath(final Node node
) {
55 if (node
== null || node
.getNodeType() == Node
.DOCUMENT_NODE
) {
59 final String selector
= getXPathSelector(node
);
61 // debugPrint("../" + selector);
63 if (set(Node
.ATTRIBUTE_NODE
, Node
.DOCUMENT_NODE
, Node
.DOCUMENT_FRAGMENT_NODE
,
64 Node
.ENTITY_NODE
, Node
.NOTATION_NODE
).contains(node
.getNodeType())) {
65 return getIdentifyingXPath(XMLTools
.getNode(node
, "..")) +
69 final NodeList siblings
= XMLTools
.getNodes(node
, "../" + selector
);
71 return getIdentifyingXPath(node
.getParentNode()) +
72 "/" + selector
+ "[" + (indexOf(siblings
, node
) + 1) + "]";
76 * Returns a XPath expression that can be used to selects nodes like {@code node}.
83 public static final String
getXPathSelector(final Node node
) {
84 if (node
.getNodeName().startsWith("#")) {
85 return node
.getNodeName().toLowerCase().substring(1) + "()";
88 if (node
.getNodeType() == Node
.ATTRIBUTE_NODE
) {
89 return "@" + node
.getNodeName();
92 return node
.getNodeName();
101 * @return {@code -1} if {@code nodes} doesn't contain {@code node}
102 * <br>Range: {@code [-1 .. nodes.getLength() - 1]}
104 public static final int indexOf(final NodeList nodes
, final Node node
) {
105 for (int i
= 0; i
< nodes
.getLength(); ++i
) {
106 if (nodes
.item(i
) == node
) {