Bạn có thể định nghĩa một resolver biến và có thẩm định của các biến thể hiện quyết tâm như $myvar
, ví dụ:
XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");
Có một lời giải thích khá tốt here. Tôi đã không thực sự làm điều này trước khi bản thân mình, vì vậy tôi có thể có một đi và cung cấp một ví dụ hoàn chỉnh hơn.
Cập nhật:
Với này một đi, một công trình xử. Đối với một ví dụ về triển khai thực hiện rất đơn giản, bạn có thể định nghĩa một lớp học mà trả về giá trị cho một biến được từ bản đồ, như thế này:
class MapVariableResolver implements XPathVariableResolver {
// local store of variable name -> variable value mappings
Map<String, String> variableMappings = new HashMap<String, String>();
// a way of setting new variable mappings
public void setVariable(String key, String value) {
variableMappings.put(key, value);
}
// override this method in XPathVariableResolver to
// be used during evaluation of the XPath expression
@Override
public Object resolveVariable(QName varName) {
// if using namespaces, there's more to do here
String key = varName.getLocalPart();
return variableMappings.get(key);
}
}
Bây giờ, kê khai và khởi một thể hiện của resolver này trong chương trình, ví dụ
MapVariableResolver vr = new MapVariableResolver() ;
vr.setVariable("myVar", "text");
...
XPath xpath = factory.newXPath();
xpath.setXPathVariableResolver(vr);
Sau đó, trong quá trình thẩm định của biểu thức XPath XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");
, biến $myVar
sẽ được thay thế bằng chuỗi text
.
Câu hỏi hay, tôi đã học được điều gì đó hữu ích cho bản thân mình!
Tôi tìm thấy nội tuyến đơn giản của các biến hơi cồng kềnh, so với khả năng sử dụng các biến thực. Bên cạnh đó, bạn sẽ phải suy nghĩ về tính toàn vẹn của cú pháp (ví dụ: nếu 'myVar' chứa dấu ngoặc kép? V.v) –