2011-09-29 23 views
5

Tôi đang cố gắng xác định xem nguồn cấp dữ liệu đã cho dựa trên Atom hay dựa trên RSS.Xác định xem nguồn cấp dữ liệu là Atom hay RSS

Dưới đây là mã của tôi:

public boolean isRSS(String URL) throws ParserConfigurationException, SAXException, IOException{ 
     DocumentBuilder builder = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder(); 
     Document doc = builder 
       .parse(URL); 
     return doc.getDocumentElement().getNodeName().equalsIgnoreCase() == "rss"; 
    } 

Có cách nào tốt hơn để làm điều đó? nó sẽ tốt hơn nếu tôi sử dụng SAX Parser chứ?

Trả lời

3

Nội dung đánh hơi là một phương pháp. Nhưng lưu ý rằng nguyên tử sử dụng các không gian tên và bạn đang tạo một trình phân tích cú pháp nhận thức không gian tên.

public boolean isAtom(String URL) throws ParserConfigurationException, SAXException, IOException{ 
    DocumentBuilderFactory f = DocumentBuilderFActory.newInstance(); 
    f.setNamespaceAware(true); 
    DocumentBuilder builder = f.newInstance().newDocumentBuilder(); 
    Document doc = builder.parse(URL); 
    Element e = doc.getDocumentElement(); 
    return e.getLocalName().equals("feed") && 
      e.getNamespaceURI().equals("http://www.w3.org/2005/Atom"); 
} 

Cũng lưu ý rằng bạn không thể so sánh bằng equalsIgnorCase(), vì tên phần tử XML phân biệt chữ hoa chữ thường.

Phương pháp khác là phản ứng trên tiêu đề Kiểu nội dung, nếu nó có sẵn trong yêu cầu HTTP GET. Loại nội dung cho ATOM sẽ là application/atom+xml và cho RSS application/rss+xml. Mặc dù vậy, tôi có thể nghi ngờ rằng không phải tất cả nguồn cấp dữ liệu RSS đều có thể tin cậy để thiết lập tiêu đề này một cách chính xác.

Tùy chọn thứ ba là xem hậu tố URL, ví dụ: .atom và .rss.

Hai phương pháp cuối cùng có thể dễ dàng cấu hình nếu bạn đang sử dụng Spring hay JAX-RS

+0

Tôi muốn cách tiếp cận của bạn trong một thế giới hoàn hảo. :) Theo kinh nghiệm của tôi, bạn sẽ phải đối phó với một loạt các nguồn cấp dữ liệu tự nhiên bỏ qua các tiêu chuẩn như Kiểu nội dung, hậu tố hoặc trường hợp của các phần tử XML. Đó là lý do tại sao tôi đề nghị một equalsIgnoreCase() - kiểm tra của phần tử gốc, vì đó là hầu như luôn luôn chính xác. – Chris

+0

@Chris. Tôi cung cấp cho bạn rằng thế giới là không hoàn hảo và kinh doanh thức ăn là hỗn loạn. Chỉ cần nhìn vào mã nguồn [ROME] (http://java.net/projects/rome/). Nhưng, ít nhất hãy sử dụng một không gian tên nhận biết trình phân tích cú pháp XML, xin vui lòng! –

+0

Tôi nghĩ rằng tôi có thể sử dụng cả hai phương pháp, một kiểm tra cho RSS, một cho Atom. –

3

Phần tử gốc là cách dễ nhất để xác định loại nguồn cấp dữ liệu.

Đối với phân tích cú pháp khác nhau có những cách khác nhau để có được những phần tử gốc. Không ai kém hơn người kia. Đã có văn bản đủ về StAX so với SAX so với DOM vv, có thể được sử dụng làm cơ sở cho một quyết định cụ thể.

Không có gì sai với hai dòng đầu tiên của mã này là:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(URL); 

Trong tuyên bố trở lại của bạn, bạn thực hiện một sai lầm trên Java String so sánh.

Khi bạn sử dụng toán tử so sánh == với chuỗi, nó so sánh tham chiếu không phải giá trị (nghĩa là bạn kiểm tra xem cả hai có chính xác cùng một đối tượng) hay không. Bạn nên sử dụng phương thức equals() tại đây. Chỉ cần chắc chắn tôi sẽ khuyên bạn nên sử dụng equalsIgnoreCase():

return doc.getDocumentElement().getNodeName().equalsIgnoreCase("rss"); 

Gợi ý: Nếu bạn kiểm tra cho "rss" thay vì "thức ăn" (như cho Atom) trong phương pháp isRss() của bạn, bạn không cần phải sử dụng các ternary nhà điều hành.

+0

Yeah, tôi biết Tôi không phải, tôi đã viết câu hỏi khi tôi thực sự buồn ngủ, xin lỗi về điều đó. –

+0

@MahmoudHossam Không có vấn đề gì, nhưng câu lệnh trả về được cập nhật của bạn (return! (Doc.getDocumentElement(). GetNodeName() == "feed");) cũng sẽ không hoạt động vì vấn đề so sánh được mô tả. – Chris

+0

cảm ơn, đã cập nhật. –

2

Bạn có thể sử dụng một cú pháp Stax để tránh phân tích toàn bộ tài liệu XML vào bộ nhớ:

public boolean isAtom(String url) throws ParserConfigurationException, SAXException, IOException{ 
    XMLInputFactory xif = XMLInputFactory.newFactory(); 
    XMLStreamReader xsr = xif.createXMLStreamReader(new URL(url).openConnection()); 
    xsr.nextTag(); // Advance to root element 
    return xsr.getLocalName().equals("feed") && 
      xsr.getNamespaceURI().equals("http://www.w3.org/2005/Atom"); 
} 
+0

Tôi sẽ sử dụng ứng dụng này trong ứng dụng Android, vì vậy tôi không chắc liệu Android có trình phân tích cú pháp StAX được tích hợp hay không và tôi không muốn thêm phụ thuộc bổ sung vì tôi sẽ thêm thư viện cho từng ứng dụng loại nguồn cấp dữ liệu đã có. –

+1

@MahmoudHossam - Android có 'XmlPullParser' là phiên bản riêng của trình phân tích cú pháp của StAX: http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html –

+0

Tôi không biết điều đó, cảm ơn. –

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