Tôi đang cố tìm cách xác định chính xác số dòng và vị trí ký tự của cả thẻ và thuộc tính trong khi phân tích cú pháp tài liệu XML. Tôi muốn làm điều này để tôi có thể báo cáo chính xác cho tác giả của tài liệu XML (thông qua giao diện web) nơi tài liệu không hợp lệ.XML/Java: Vị trí chính xác và vị trí ký tự trong khi phân tích cú pháp thẻ và thuộc tính?
Cuối cùng, tôi muốn đặt dấu mũ vào thẻ không hợp lệ hoặc chỉ trong dấu ngoặc kép mở của thuộc tính không hợp lệ. (Tôi không sử dụng Lược đồ XML tại thời điểm này vì định dạng chính xác của các thuộc tính quan trọng theo cách không thể được xác thực bởi lược đồ một mình. Tôi thậm chí có thể muốn báo cáo một số thuộc tính như là một phần không hợp lệ thông qua giá trị của thuộc tính. , một phần thông qua văn bản giữa thẻ bắt đầu và thẻ kết thúc.)
Tôi đã thử sử dụng SAX (org.xml.sax) và giao diện Người định vị. Điều này hoạt động đến một điểm nhưng không đủ tốt. Nó sẽ chỉ báo cáo vị trí đã đọc sau một sự kiện; ví dụ: ký tự ngay sau khi thẻ mở kết thúc, cho startElement(). Tôi không thể trừ đi độ dài của tên thẻ vì các thuộc tính, thẻ tự đóng và/hoặc dòng mới trong thẻ mở sẽ loại bỏ điều này. (Và Locator không cung cấp thông tin về vị trí của các thuộc tính.)
Lý tưởng nhất là tôi đang tìm cách sử dụng phương pháp dựa trên sự kiện, vì tôi đã có trình xử lý SAX đang xây dựng một đại diện giống như DOM hoặc tiếp tục xử lý. Tuy nhiên, tôi muốn biết về bất kỳ thư viện DOM hoặc DOM nào bao gồm thông tin vị trí chính xác cho các yếu tố của mô hình.
Có ai đã giải quyết vấn đề này hay bất kỳ vấn đề nào tương tự, với mức độ chính xác được yêu cầu không?
Phương pháp tiếp cận dựa trên sự kiện? Giống như [XMLEventReader] (http://docs.oracle.com/javase/8/docs/api/javax/xml/stream/XMLEventReader.html) và [XMLEvent.getLocation] (http://docs.oracle. com/javase/8/docs/api/javax/xml/luồng/sự kiện/XMLEvent.Phương thức html # getLocation--)? – VGR
Tôi đã thử sử dụng không phải XMLEventReader, nhưng XMLStreamReader. Tuy nhiên các vị trí báo cáo này là vị trí cuối cùng của mỗi sự kiện. Ví dụ: sau START_ELEMENT vị trí được chỉ định ngay sau khi đóng thẻ bắt đầu (chú thích - thẻ bắt đầu, không phải phần tử). Dường như không có cách đáng tin cậy để xác định vị trí bắt đầu của thẻ. Ngoài ra, tôi không bao giờ nhận được bất kỳ sự kiện ATTRIBUTE nào cả vì những sự kiện này được kết hợp thành một sự kiện START_ELEMENT duy nhất: vì vậy tôi không thể nhận được bất kỳ chính xác hơn nữa về vị trí thuộc tính. – Paul
Hãy giải thích ý của bạn khi bạn nói rằng bạn * không sử dụng Lược đồ XML tại thời điểm này vì định dạng chính xác của các thuộc tính quan trọng theo cách không thể được xác thực bởi lược đồ. * – kjhughes