Java XML解析和原始字节偏移量

10

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

例如,如果我有一个XML文档,内容类似于:

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

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

标准Java XML解析器可以实现这个功能吗?JAXB呢?如果没有简单的解决方案,需要在解析路径上进行哪些类型的更改才能实现此功能?


1
请查看此问题https://dev59.com/KaDia4cB1Zd3GeqPKNdv,以找到大型XML文件中的字符偏移量,并了解如何与JAXB一起使用。 - jschnasse
2个回答

6
SAX API提供了一种相当晦涩的机制来实现此功能 - org.xml.sax.Locator接口。当您使用SAX API时,您需要继承DefaultHandler并将其传递给SAX解析方法,SAX解析器实现会通过setDocumentLocator()向您的DefaultHandler注入一个Locator。随着解析的进行,您的ContentHandler上的各种回调方法被调用(例如startElement()),此时您可以查看Locator以获取解析位置(通过getColumnNumber()getLineNumber())。
从技术上讲,这是可选功能,但javadoc表示强烈建议实现它,因此您可以假设JavaSE内置的SAX解析器会执行此操作。
当然,这意味着使用SAX API,这不是任何人都想做的事情,但我找不到使用更高级别API访问此信息的方法。
编辑:找到此示例

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接