2009-04-30 35 views

Trả lời

1

chuyển đổi chuỗi này vào một đối tượng DOM và ghé thăm các nút:

Document dom= DocumentBuilderFactory().newDocumentBuilder().parse(new InputSource(new StringReader(myxml))); 
Element root= dom.getDocumentElement(); 
for(Node n=root.getFirstChild();n!=null;n=n.getNextSibling()) 
{ 
System.err.prinlnt("Current node is:"+n); 
} 
27

XPath sử dụng Java 1.5 trở lên, mà không phụ thuộc bên ngoài:

String xml = "<resp><status>good</status><msg>hi</msg></resp>"; 

XPathFactory xpathFactory = XPathFactory.newInstance(); 
XPath xpath = xpathFactory.newXPath(); 

InputSource source = new InputSource(new StringReader(xml)); 
String status = xpath.evaluate("/resp/status", source); 

System.out.println("satus=" + status); 
+3

Trông không đơn giản ;-) –

+1

Vâng, tôi đồng ý với Peter, đây không phải là cách đơn giản nhất *. Điều tốt ở đây là cho thấy làm thế nào để làm điều đó bằng cách sử dụng JDK tinh khiết không có libs bên ngoài. Một cách đơn giản hơn một chút: http://stackoverflow.com/questions/807418/simplest-way-to-query-xml-in-java/831595#831595 – Jonik

+0

Đúng, ngay cả các tác vụ đơn giản sử dụng các thư viện Java XML chuẩn đều hiển thị tất cả quá rõ ràng rằng các tác giả đã đọc cuốn sách GoF. Tuy nhiên, tùy thuộc vào ứng dụng, việc quản lý thư viện của bên thứ ba có thể tạo ra một loạt các biến chứng khác nhau. – McDowell

2

Sau bạn đã thực hiện với các cách đơn giản để truy vấn XML trong java. Nhìn vào XOM.

7

Sử dụng dom4j, tương tự như McDowell's solution:

String myxml = "<resp><status>good</status><msg>hi</msg></resp>"; 

Document document = new SAXReader().read(new StringReader(myxml)); 
String status = document.valueOf("/resp/msg"); 

System.out.println("status = " + status); 

xử lý XML là một chút đơn giản sử dụng dom4j. Và một số thư viện XML có thể so sánh khác exist. Giải pháp thay thế cho dom4j là discussed here.

6

Dưới đây là ví dụ về làm thế nào để làm điều đó với XOM:

String myxml = "<resp><status>good</status><msg>hi</msg></resp>"; 

Document document = new Builder().build(myxml, "test.xml"); 
Nodes nodes = document.query("/resp/status"); 

System.out.println(nodes.get(0).getValue()); 

Tôi thích XOM hơn dom4j cho simplicity and correctness của nó. XOM sẽ không cho phép bạn tạo XML không hợp lệ ngay cả khi bạn muốn ;-) (ví dụ với các nhân vật bất hợp pháp trong dữ liệu ký tự)

+0

Hmm, đẹp, điều này trông đơn giản ... Nhưng chỉ để so sánh dễ dàng hơn, bạn có thể chỉnh sửa nó để hoạt động chính xác như các giải pháp của McDowell và tôi không? :) Tôi đoán bạn sẽ cần phải thêm một dòng hoặc ba. – Jonik

+0

Ok, nó đã thay đổi ngay bây giờ ;-) Bạn đúng ... nhận được chuỗi giá trị của tất cả các nút được trả về yêu cầu một số chơi với các chỉ mục. Tôi không hiểu tại sao không có phương thức Nodes.getValue() để trả về giá trị chuỗi của tất cả các nút được trả về. (Tôi cũng 'lừa' với Builder mới(). Xây dựng (...) ;-) nhưng bạn guys có chuỗi tương tự trong mã của bạn quá). –

+0

Cảm ơn. Bạn đang đúng về chuỗi :) Nhưng yeah, điều này vẫn còn khá sạch sẽ, phần lớn nhờ Builder(). Build(). Bây giờ, nếu chỉ bạn có thể làm một cái gì đó như document.valueOf (xpath) trong dom4j ... +1 – Jonik

1

@The ý kiến ​​của answer này:

Bạn có thể tạo một phương pháp để làm cho nó trông đơn giản

String xml = "<resp><status>good</status><msg>hi</msg></resp>"; 

System.out.printf("satus= %s\n", getValue("/resp/status", xml)); 

Việc thực hiện:

public String getValue(String path, String xml) { 
    return XPathFactory 
       .newInstance() 
       .newXPath() 
       .evaluate(path , new InputSource(
           new StringReader(xml))); 

} 
+0

Chắc chắn, nhưng cũng trong các giải pháp đơn giản hơn (http://stackoverflow.com/questions/807418/simplest-way-to- query-xml-in-java/831623 # 831623, http://stackoverflow.com/questions/807418/simplest-way-to-query-xml-in-java/831595#831595) bạn có thể tạo các phương thức trợ giúp để tạo chúng thậm chí còn đơn giản hơn! (Ví dụ, nếu tôi đã thực sự mã hóa điều này (tại nơi làm việc), tôi sẽ sử dụng XMLUtils.readFromString (String xml) để làm lại tài liệu, thay vì công cụ SAXReader mà tôi đã sử dụng trong câu trả lời của mình.) – Jonik

0

đây là một đoạn mã của truy vấn XML của bạn với VTD-XML

import com.ximpleware.*; 
public class simpleQuery { 

    public static void main(String[] s) throws Exception{ 
     String myXML="<resp><status>good</status><msg>hi</msg></resp>"; 
     VTDGen vg = new VTDGen(); 
     vg.setDoc(myXML.getBytes()); 
     vg.parse(false); 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("/resp/status"); 
     int i = ap.evalXPath(); 
     if (i!=-1) 
      System.out.println(" result ==>"+vn.toString(i)); 
    } 
} 
Các vấn đề liên quan