2010-07-03 31 views
12

Tôi có biểu thức XPath tìm kiếm giá trị tĩnh. Trong ví dụ này, "test" là giá trị đó:Gửi XPath biến từ Java

XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()"); 

Làm cách nào để chuyển một biến thay vì chuỗi cố định? Tôi sử dụng Java với Eclipse. Có cách nào để sử dụng giá trị của Java String để khai báo biến XPath không?

Trả lời

17

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!

0

Bạn không cần đánh giá Java (hoặc bất kỳ biến PL nào khác trong XPath). Trong C# (không biết Java tốt) Tôi sẽ sử dụng:

string XPathExpression = 
"//doc[contains(., " + myVar.ToString() + ")]/*/text()"; 

    XmlNodelist result = xmlDoc.SelectNodes(XPathExpression); 
+1

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) –

0

Ngoài answer here này, giải thích như thế nào để làm điều đó với các Java API tiêu chuẩn, bạn cũng có thể sử dụng một thư viện của bên thứ ba như jOOX có thể xử lý các biến theo cách đơn giản:

List<String> list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();