2009-05-29 35 views
7

Đây là mã của tôi:Sử dụng công cụ SAXON XPath trong 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(); 
    } 

} 

Và tôi có được điều này:

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) 

Có nghĩa là Java được sử dụng org.apache.xpath.compiler.XPathParser lớp khi tôi tạo ra rõ ràng nhà máy của mình thông qua net.sf.saxon.xpath.XPathFactoryImpl.

(Tôi thực sự chỉ cần đặt một số matches trong xpath của tôi ... vì vậy nếu bất kỳ giải pháp nào không liên quan đến Saxon được biết đến, hãy xem xét nhu cầu của tôi đã đạt được).

Tôi đang làm gì sai?

Trả lời

11

Từ ví dụ Saxon:

System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); 
XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); 

trình tốt.

+0

Nếu bạn bối rối về các tệp jar, bạn cần thêm lõi saxon và vòm mái vòm saxon vào phụ thuộc của bạn để làm cho nó hoạt động hoặc bạn sẽ nhận được "" Không thể định vị một mô hình đối tượng thực hiện cho các nút của lớp com. sun.org.apache.xerces.internal.dom.DeferredDocumentImpl "Ngoại lệ – Arash

+0

Làm thế nào để tôi làm ngược lại, tức là, buộc nó sử dụng XPathFactory mặc định trong JVM (thay vì Saxon)? –

+0

Không có James, bởi vì chúng tôi muốn Sử dụng XPath 2.0 chức năng như 'phù hợp' ở đây – Donatello

Các vấn đề liên quan