viernes, 17 de abril de 2015

XPath and Name Spaces, don't you hate them too??

How about running a XPath expression from Java?
Pretty straight forward right, oh wait NAMESPACE!!!!

Here's a example on how to create your xpaht parser and the more complex Name Space Context.
Let's start with the NameSpaceContextImpl
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import org.apache.commons.lang.Validate;
public class NamespaceContextImpl implements NamespaceContext {
private Map<String, String> namespaceMap = new HashMap<String, String>();
public NamespaceContextImpl(Map<String, String> namespaceMap) {
this.namespaceMap = namespaceMap;
}
public void addNamespace(String prefix, String uri) {
Validate.notEmpty(prefix, "The prefix can not be null nor empty");
Validate.notEmpty(uri, "The uri can not be null nor empty");
this.namespaceMap.put(prefix, uri);
}
public String getNamespaceURI(String prefix) {
String uri = this.namespaceMap.get(prefix);
return uri == null ? XMLConstants.NULL_NS_URI : uri;
}
public String getPrefix(String namespace) {
for (String prefix : this.namespaceMap.keySet()) {
if (this.namespaceMap.get(prefix).equals(namespace)) {
return prefix;
}
}
return null;
}
public Iterator getPrefixes(String namespace) {
return null;
}
}

Now the actual Xpath parser imple:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
// here's the fun part define your name spaces
Map<String, String> namesapaceMap = new HashMap<String, String>();
namesapaceMap.put("xmlns", "http://your.name.space.location.com/something/something");
// feed your context with the namespaces
NamespaceContext context = new NamespaceContextImpl(namesapaceMap);
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(context);
// run your xpath
System.out.println(xpath.compile("//Fields").evaluate(doc));
view raw gistfile1.java hosted with ❤ by GitHub
Hope it helps guy!!!

No hay comentarios:

Publicar un comentario