2009-11-03 27 views
19

tôi nhận được ngoại lệ sau khi cố gắng truy cập vào bất kỳ nút của một tài liệu xml phân tích cú pháp trên dom4j:Sử dụng XPath trong Dom4j

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException 
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230) 
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207) 
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164) 
at xmlparser.LevelsExtractor.findI(LevelsExtractor.java:73) 
at xmlparser.Main.main(Main.java:33) 

Tôi biết rằng các công trình phân tích cú pháp, vì tôi có thể có in phân tích cú pháp ra xml tài liệu hoặc lưu nó vào tập tin. Đây là mã tôi đang sử dụng.

Để phân tích tài liệu:

public class Parser { 

public Document parseWithSAX(File aFile) throws DocumentException { 
    SAXReader xmlReader = new SAXReader(); 
    Document doc = xmlReader.read(aFile); 
    return doc; 
    } 

Để thử để có được một nút Tôi đã thử các dòng sau, tất cả đều tạo ra các lỗi tương tự:

 List list = doc.selectNodes(""); 
     QName qn = new QName("////Token/text()='Introduction'"); 
     Element el = doc.selectSingleNode("////Token/text()='Introduction'"); 
     Node node = doc.selectSingleNode("/DOCUMENT/PAGE/TEXT/TOKEN/text()= 'Introduction'"); 

này sẽ in ra xml doc mà tôi giả định có nghĩa là doc (đó là tài liệu xml được phân tích cú pháp) chứa những gì cần.

 System.out.println(doc.asXML()); 

Tôi thực sự đánh giá cao sự trợ giúp của bạn!

Trả lời

16

Bạn nên thêm jaxen thư viện vào đường dẫn lớp học của mình.

EDIT: Trên thực tế, bản gốc dom4j distribution chứa jaxen.jar trong đó cũng như tất cả các phụ thuộc khác.

+0

Tôi nghĩ bản phân phối cũng bao gồm lib jaxen, nhưng tôi đã bao gồm bình bây giờ chỉ để xem và nó đã xóa thông báo lỗi. Thật không may nó đã cho tôi một cái mới. Vì vậy, bây giờ nó than phiền ở khung kết thúc của một khối mã bằng cách sử dụng tài liệu được phân tích cú pháp rằng "nó đến cuối tệp trong khi phân tích cú pháp." Bây giờ điều này xảy ra ngay cả trên mã mà đi qua cây thông qua vòng lặp (mà làm việc trước đó). Tôi nghĩ rằng điều này có nghĩa là bình jaxon mới đang rối tung với việc phân tích cú pháp, nhưng tôi vẫn có thể phân tích cú pháp và sau đó in lại tập tin, vì vậy dường như không phải như vậy. –

+0

NoClassDefFoundException chỉ có thể có nghĩa là bạn không có lớp cần thiết trên đường dẫn lớp của bạn hoặc có phiên bản sai của điều đó. Hãy kiểm tra lại đường dẫn lớp học của bạn. Loại bỏ các lọ không cần thiết và chỉ thêm những cái được sử dụng. –

+0

lọ duy nhất tôi đã có ban đầu là dom4j-1.6.1.jar, trong đó đã cho tôi lỗi lớp học. Tôi đã thêm jaxen-1.1.1.jar đã loại bỏ lỗi def của lớp và đã cho tôi "kết thúc tệp trong khi phân tích cú pháp lỗi". Cảm ơn sự giúp đỡ của bạn và phản ứng nhanh Superfilin. –

1

A java.lang.NoClassDefFoundError được JVM đưa ra khi một phụ thuộc có sẵn tại thời điểm không thể tìm thấy một lớp cụ thể được biên dịch trên đường dẫn lớp khi lớp được nạp để JVM sử dụng.

Bạn gọi mã trình phân tích cú pháp như thế nào? Kiểm tra và đảm bảo rằng tất cả các phụ thuộc DOM4J trong thư mục lib của bản phân phối DOM4J (jaxen, jaxme-api, vv) đều nằm trên đường dẫn lớp.

Nếu bạn là cách gọi phân tích cú pháp từ dòng lệnh, bạn có thể sử dụng -classpath tùy chọn:

java -classpath C:\myjars\jar1.jar;C:\myjars\jar1.jar 

Nếu bạn là cách gọi phân tích cú pháp từ Ant ví dụ sử dụng <classpath> tag:

<classpath> 
    <pathelement path="C:\myjars\jar1.jar"/> 
    <pathelement path="C:\myjars\jar2.jar"/> 
</classpath> 

Các biểu thức xpath của bạn thậm chí không được đánh giá, do đó bạn nên ngăn chặn các biểu thức đó cho đến khi bạn đã sắp xếp các vấn đề về classpath của mình.

5

Vì vậy, xpath hoạt động nếu tôi bao gồm jaxen-1.1-beta-6.jar ngoài jar jdom4. Lưu ý rằng jaxen-1.1.1.jar không hoạt động. Nếu bạn có lỗi classdef từ jdom, hãy nhìn vào các phụ thuộc của chúng và đảm bảo rằng bạn đang sử dụng các lọ đã được phê duyệt của chúng, (đối với phiên bản 1.6.1 thường là bản phát hành cũ hơn của jar). Hy vọng điều này sẽ giúp bất cứ ai có một vấn đề tương tự. Cảm ơn một lần nữa vì sự giúp đỡ của mọi người!

17

Nếu bạn đang sử dụng mvn2, sau đây sẽ làm việc với dom4j 1.6.1:

<dependency> 
<groupId>jaxen</groupId> 
<artifactId>jaxen</artifactId> 
<version>1.1.1</version> 
</dependency> 

Điều đó đang được nói, tôi hy vọng họ sửa chữa pom của họ và lưu tất cả mọi người rắc rối này.

0

Trong trường hợp không chắc rằng bất cứ ai khác nên gặp phải vấn đề này trong JBoss Fuse Tôi sẽ thêm gì giải quyết vấn đề của tôi:

Bạn sẽ cần phải quấn cả jaxen- và lọ dom4j như OSGi-bó.

osgi:install -s wrap:mvn:jaxen/jaxen/1.1-beta-6 
osgi:install -s wrap:mvn:dom4j/dom4j/1.6.1 

Theo thứ tự cụ thể đó, khi tôi phát hiện ra một cách khó khăn. Tôi đã bọc bình dom4j và chỉ cần thêm bình jaxen sau khi thực tế không thành công.

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