Java XML解析和原始字节偏移

时间:2010-08-17 22:05:11

标签: java xml parsing jaxb sax

我想将一些结构良好的XML解析为DOM,但我想知道原始媒体中每个节点标记的偏移量。

例如,如果我的XML文档的内容类似于:

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

我想知道节点从原始媒体的偏移量13开始,并且(更重要的是)“文本”从偏移量18开始。

标准Java XML解析器是否可以实现? JAXB?如果没有容易获得的解决方案,那么在解析路径上需要进行哪些类型的更改才能实现这一点?

2 个答案:

答案 0 :(得分:4)

SAX API为此提供了一种相当模糊的机制 - org.xml.sax.Locator接口。当您使用SAX API时,您继承DefaultHandler并将其传递给SAX解析方法,并且SAX解析器实现应该通过{{1}向Locator注入DefaultHandler }。随着解析的进行,调用setDocumentLocator()上的各种回调方法(例如ContentHandler),此时您可以查阅startElement()以找出解析位置(通过{{1} }和Locator

从技术上讲,这是可选功能,但是javadoc说“强烈鼓励”实现提供它,所以你可以假设JavaSE中内置的SAX解析器会这样做。

当然,这确实意味着使用SAX API,这不是一个有趣的想法,但我看不到使用更高级API访问此信息的方法。

编辑:找到this example

答案 1 :(得分:2)

使用XML Streamreader及其getLocation()方法返回位置对象。 location.getCharacterOffset()给出当前位置的字节偏移量。

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();
    }