2010-08-17 44 views
8

Tôi muốn phân tích một số XML được định dạng tốt thành DOM, nhưng tôi muốn biết độ lệch của thẻ của mỗi nút trong phương tiện gốc.Phân tích cú pháp XML Java và bù gốc byte

Ví dụ, nếu tôi có một tài liệu XML với một cái gì đó nội dung như:

<html> 
<body> 
<div>text</div> 
</body> 
</html> 

Tôi muốn biết rằng nút bắt đầu tại offset 13 trong giới truyền thông ban đầu, và (quan trọng hơn) mà "văn bản" bắt đầu ở độ lệch 18.

Điều này có thể thực hiện với các trình phân tích cú pháp XML Java chuẩn không? JAXB? Nếu không có giải pháp nào có sẵn một cách dễ dàng, loại thay đổi nào cần thiết dọc theo đường dẫn phân tích để thực hiện điều này có thể?

+0

Hãy xem câu hỏi này http://stackoverflow.com/questions/43366566 để tìm số ký tự bù trừ trong tệp XML lớn và cách sử dụng với JAXB. – jschnasse

Trả lời

4

API SAX cung cấp một cơ chế khá mơ hồ cho điều này - giao diện org.xml.sax.Locator. Khi bạn sử dụng API SAX, bạn phân lớp DefaultHandler và chuyển cho phương thức phân tích cú pháp SAX và triển khai trình phân tích cú pháp SAX được yêu cầu để tiêm Locator vào số DefaultHandler qua setDocumentLocator(). Như số tiền thu được phân tích cú pháp, các phương pháp gọi lại khác nhau về bạn ContentHandler được gọi (ví dụ startElement()), lúc này bạn có thể tham khảo Locator để tìm ra vị trí phân tích cú pháp (thông qua getColumnNumber()getLineNumber())

Về mặt kỹ thuật, đây là chức năng tùy chọn, nhưng javadoc nói rằng việc triển khai thực hiện "được khuyến khích mạnh mẽ" để cung cấp nó, vì vậy bạn có thể giả định trình phân tích cú pháp SAX được xây dựng trong JavaSE sẽ làm điều đó.

Tất nhiên, điều này có nghĩa là sử dụng API SAX, đó là ý tưởng vui vẻ của ai đó, nhưng tôi không thể thấy cách truy cập thông tin này bằng API cấp cao hơn.

chỉnh sửa: Tìm thấy this example.

1

Sử dụng XML Streamreader và phương thức getLocation() của nó để trả về đối tượng vị trí. location.getCharacterOffset() cho phép bù đắp byte của vị trí hiện tại.

import javax.xml.stream.Location; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamReader; 

public class Runner { 

public static void main(String argv[]) { 

    XMLInputFactory factory = XMLInputFactory.newInstance(); 
    try{ 
    XMLStreamReader streamReader = factory.createXMLStreamReader(
      new FileReader("D:\\BigFile.xml")); 

    while(streamReader.hasNext()){ 
     streamReader.next(); 
     if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT){ 
      Location location = streamReader.getLocation(); 
      System.out.println("byte location: " + location.getCharacterOffset()); 
      } 
     } 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } 
Các vấn đề liên quan