Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML解析和原始字节偏移_Java_Xml_Parsing_Jaxb_Sax - Fatal编程技术网

Java XML解析和原始字节偏移

Java XML解析和原始字节偏移,java,xml,parsing,jaxb,sax,Java,Xml,Parsing,Jaxb,Sax,我想将一些格式良好的XML解析为DOM,但我想知道每个节点的标记在原始媒体中的偏移量 例如,如果我有一个XML文档,其内容如下: <html> <body> <div>text</div> </body> </html> 文本 我想知道在原始媒体中,节点从偏移量13开始,“文本”从偏移量18开始 使用标准的Java XML解析器可以做到这一点吗?JAXB?如果没有容易获得的解决方案,那么在解析路径上需要进行哪些类型的更

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

例如,如果我有一个XML文档,其内容如下:

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

文本
我想知道在原始媒体中,节点从偏移量13开始,“文本”从偏移量18开始


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

SAX API为此提供了一种相当模糊的机制—接口。当您使用SAXAPI时,您将子类化
DefaultHandler
并将其传递给SAX解析方法,SAX解析器实现将通过
setDocumentLocator()
DefaultHandler
注入
Locator
。在解析过程中,会调用
ContentHandler
上的各种回调方法(例如
startElement()
),此时您可以咨询
定位器来查找解析位置(通过
getColumnNumber()
getLineNumber()

从技术上讲,这是可选的功能,但是javadoc说“强烈鼓励”实现提供它,因此您可以假设内置在JavaSE中的SAX解析器将提供它

当然,这确实意味着使用SAXAPI,这是noone的乐趣所在,但我看不到使用更高级API访问这些信息的方法


编辑:找到。

使用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();
    }
看一看这个问题,找出大型XML文件中的字符偏移量,以及如何与JAXB一起使用