Я хочу загрузить все XPath и переменные в CachedExpr сразу и использовать их несколько раз. кто-нибудь может предоставить образцы для добавления переменных и XPath в CachedExpr, а также сообщить мне, как объявить в нем XPathNamespace.
public class VTDParser {
private final CustomAutoPilot autoPilot;
public static class CustomAutoPilot extends com.ximpleware.AutoPilot {
final Hashtable<String, com.ximpleware.Expr> variables = new Hashtable<>();
public CustomAutoPilot() {
super();
}
public CustomAutoPilot(VTDNav v) {
super(v);
}
public void declareVariableExpr(String varName, String varExpr) throws XPathParseException {
try {
parser p = new parser(new StringReader(varExpr));
p.nsHash = nsHash;
p.symbolHash = variables;
xpe = (com.ximpleware.Expr) p.parse().value;
variables.put(varName, xpe);
ft = true;
} catch ( XPathParseException e ) {
throw e;
} catch ( Exception e ) {
throw new XPathParseException("Error occurred");
}
}
@Override
public void selectXPath(String s) throws XPathParseException {
try {
parser p = new parser(new StringReader(s));
p.nsHash = nsHash;
p.symbolHash = variables;
xpe = (com.ximpleware.Expr) p.parse().value;
ft = true;
if ( enableCaching )
xpe.markCacheable();
} catch ( XPathParseException e ) {
throw e;
} catch ( Exception e ) {
throw new XPathParseException("");
}
}
public VTDNav getNavigationObject() {
return vn;
}
}
public VTDParser(String message) throws ParseException {
try {
VTDGen vg = new VTDGen();
byte[] content = message.getBytes(Charset.defaultCharset());
vg.setDoc(content);
vg.parse(true);
VTDNav vn = vg.getNav();
autoPilot = new CustomAutoPilot(vn);
autoPilot.declareXPathNameSpace("prefix", "http://www.w3.org");
} catch ( ParseException e ) {
throw e;
}
}
public String asString(String xpath) throws XPathParseException {
try {
autoPilot.selectXPath(xpath);
return autoPilot.evalXPathToString().trim();
} catch ( XPathParseException e ) {
throw e;
}
}
public void variable(String name, String value) throws XPathParseException {
try {
autoPilot.declareVariableExpr(name, value);
} catch ( XPathParseException e ) {
throw e;
}
}
public static void main(String[] args) throws ParseException, XPathParseException {
String xml = "<tree><fruit> Mango</fruit></tree>";
VTDParser parser = new VTDParser(xml);
System.out.println(parser.asString("//tree/fruit"));
}
}
Мы написали класс CustomAutopilot, который успешно анализируется. МЫ хотим скомпилировать список xpath в CachedExpr и повторно использовать его вместо компиляции каждый раз.