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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); |
No hay comentarios:
Publicar un comentario