7
Aquí está mi código:utilizando el motor de SAXON Xpath en Java
public static void main(String[] args) {
// System.setProperty(
// "javax.xml.xpath.XPathFactory",
// "net.sf.saxon.xpath.XPathFactoryImpl");
String xml="<root><a>#BBB#</a><a>#CCC#</a><b><a>#DDD#</a></b></root>";
try{
JDocument dom = new JDocument(xml);
XPathFactory factory = net.sf.saxon.xpath.XPathFactoryImpl.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//a[matches(.,'#...#')]");
Object result = expr.evaluate(dom, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
Nodes sharped = new Nodes(nodes);
for (Node n:sharped){
System.out.println(n.toString());
}
}
catch(Exception e){
e.printStackTrace();
}
}
Y conseguir esto:
javax.xml.transform.TransformerException: Impossible to find the function : matches
at org.apache.xpath.compiler.XPathParser.error(XPathParser.java:608)
at org.apache.xpath.compiler.XPathParser.FunctionCall(XPathParser.java:1505)
at org.apache.xpath.compiler.XPathParser.PrimaryExpr(XPathParser.java:1444)
at org.apache.xpath.compiler.XPathParser.FilterExpr(XPathParser.java:1343)
at org.apache.xpath.compiler.XPathParser.PathExpr(XPathParser.java:1276)
Lo que significa que Java está utilizando org.apache.xpath.compiler.XPathParser
clase cuando claramente creado mi fábrica a través de net.sf.saxon.xpath.XPathFactoryImpl
.
(en realidad solo necesito poner matches
en mis xpaths ... entonces, si se conoce alguna solución que no involucre a Saxon, considere mi necesidad).
¿Qué estoy haciendo mal?
Si está confundido acerca de los archivos jar, necesita agregar saxon core y saxon dome a sus dependencias para que funcione, o obtendrá un "" No se puede ubicar una implementación de modelo de objeto para los nodos de clase com. sun.org.apache.xerces.internal.dom.DeferredDocumentImpl "Excepción – Arash
¿Cómo hago lo contrario, es decir, le obligo a usar XPathFactory por defecto en la JVM (en lugar de Saxon)? –
No James, porque queremos use XPath 2.0 funciones como 'coincidencias' aquí. – Donatello