2011-08-08 24 views
6

Tôi có một quá trình phân tích một file XML sử dụng JDOM và xpath để phân tích các tập tin như hình dưới đây:Parsing bị thay đổi/không đầy đủ/file XML không hợp lệ

private static SAXBuilder builder   = null; 
private static Document  doc   = null; 
private static XPath  xpathInstance  = null; 

builder = new SAXBuilder(); 
Text list = null; 

try { 
    doc = builder.build(new StringReader(xmldocument)); 

} catch (JDOMException e) { 
      throw new Exception(e); 
} 



try { 
    xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()"); 
    list = (Text) xpathInstance.selectSingleNode(doc); 
} catch (JDOMException e) { 
    throw new Exception(e); 
} 

Trên đây hoạt động tốt. Các biểu thức xpath được lưu trữ trong một tệp thuộc tính để chúng có thể được thay đổi bất cứ lúc nào. Bây giờ tôi phải xử lý một số tệp xml khác đến từ hệ thống kế thừa sẽ chỉ gửi các tệp xml theo khối 4000 byte. Việc xử lý hiện có đọc các khối 4000 byte và lưu trữ chúng trong một cơ sở dữ liệu Oracle với mỗi đoạn như một hàng trong cơ sở dữ liệu (Thực hiện bất kỳ thay đổi nào đối với hệ thống kế thừa hoặc xử lý lưu trữ các khối như các hàng trong cơ sở dữ liệu nằm ngoài câu hỏi) .

Tôi có thể tạo tài liệu XML hợp lệ hoàn chỉnh bằng cách trích xuất tất cả các hàng liên quan đến tài liệu xml cụ thể và hợp nhất chúng và sau đó sử dụng xử lý hiện có (được hiển thị ở trên) để phân tích cú pháp tài liệu xml.

Vấn đề là dữ liệu tôi cần trích xuất từ ​​tài liệu XML sẽ luôn nằm trong 4000 byte đầu tiên. Tài liệu này không phải là tài liệu XML hợp lệ vì nó sẽ không đầy đủ nhưng sẽ chứa tất cả dữ liệu tôi cần. Tôi không thể phân tích cú pháp chỉ một đoạn như người xây dựng JDOM sẽ từ chối nó.

Tôi tự hỏi liệu tôi có thể phân tích cú pháp đoạn XML không đúng định dạng mà không phải hợp nhất tất cả các phần (có thể nhận được khá nhiều) để lấy một tài liệu XML hợp lệ. Điều này sẽ tiết kiệm cho tôi một số chuyến đi đến cơ sở dữ liệu để kiểm tra xem một đoạn có sẵn và tôi sẽ không phải kết hợp 100s của khối chỉ để có thể sử dụng 4000 byte đầu tiên.

Tôi biết tôi có thể sử dụng các hàm chuỗi của java để trích xuất dữ liệu có liên quan nhưng điều này có thể sử dụng trình phân tích cú pháp hoặc thậm chí là xpath không? hoặc cả hai đều mong đợi tài liệu xml là một tài liệu được định dạng tốt trước khi nó có thể phân tích nó?

Trả lời

5

Bạn có thể thử sử dụng JSoup để phân tích cú pháp XML không hợp lệ. Theo định nghĩa, XML phải được định dạng tốt, nếu không nó không hợp lệ và không nên được sử dụng.

CẬP NHẬT - ví dụ:

public static void main(String[] args) { 
    for (Node node : Parser.parseFragment("<test><author name=\"Vlad\"><book name=\"SO\"/>" , 
      new Element(Tag.valueOf("p"), ""), 
      "")) { 
     print(node, 0); 
    } 
} 

public static void print(Node node, int offset) { 
    for (int i = 0; i < offset; i++) { 
     System.out.print(" "); 
    } 
    System.out.print(node.nodeName()); 
    for (Attribute attribute: node.attributes()) { 
     System.out.print(", "); 
     System.out.print(attribute.getKey() + "=" + attribute.getValue()); 
    } 
    System.out.println(); 
    for (Node child : node.childNodes()) { 
     print(child, offset + 4); 
    } 
} 
+0

Cảm ơn - Tôi nghĩ rằng đây là cụ thể cho tài liệu HTML. Tôi không làm việc với HTML. – ziggy

+0

@ziggy: Hãy thử phân tích cú pháp() một lần thử! Xem cập nhật của tôi. – Vlad

+0

aha .. thật thú vị. Tôi sẽ kiểm tra nó. Cảm ơn – ziggy

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