1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.html.xpath;
16
17 import java.util.Map;
18
19 import org.htmlunit.html.DomAttr;
20 import org.htmlunit.html.DomElement;
21 import org.htmlunit.html.DomNode;
22 import org.htmlunit.xml.XmlPage;
23 import org.htmlunit.xpath.xml.utils.PrefixResolverDefault;
24 import org.w3c.dom.Node;
25
26
27
28
29
30
31
32 public final class HtmlUnitPrefixResolver extends PrefixResolverDefault {
33
34
35
36
37
38 public HtmlUnitPrefixResolver(final Node xpathExpressionContext) {
39 super(xpathExpressionContext);
40 }
41
42
43
44
45 @Override
46 public String getNamespaceForPrefix(final String prefix, final Node namespaceContext) {
47 String namespace = super.getNamespaceForPrefix(prefix, namespaceContext);
48 if (namespace == null) {
49 if (namespaceContext instanceof XmlPage) {
50 final DomElement documentElement = ((XmlPage) namespaceContext).getDocumentElement();
51 if (documentElement != null) {
52 namespace = getNamespace(documentElement, prefix);
53 }
54 }
55 else if (namespaceContext instanceof DomElement) {
56 namespace = getNamespace((DomElement) namespaceContext, prefix);
57 }
58 }
59 return namespace;
60 }
61
62 private String getNamespace(final DomElement element, final String prefix) {
63 final Map<String, DomAttr> attributes = element.getAttributesMap();
64 final String xmlns = "xmlns:";
65 final int xmlnsLength = xmlns.length();
66
67 for (final Map.Entry<String, DomAttr> entry : attributes.entrySet()) {
68 final String name = entry.getKey();
69 if (name.startsWith(xmlns) && name.regionMatches(xmlnsLength, prefix, 0, prefix.length())) {
70 return entry.getValue().getValue();
71 }
72 }
73 for (final DomNode child : element.getChildren()) {
74 if (child instanceof DomElement) {
75 final String namespace = getNamespace((DomElement) child, prefix);
76 if (namespace != null) {
77 return namespace;
78 }
79 }
80 }
81 return null;
82 }
83 }