我想将一些格式良好的XML解析成DOM,但我想知道每个节点标记在原始媒体中的偏移量。
例如,如果我有一个XML文档,内容类似于:
<html>
<body>
<div>text</div>
</body>
</html>
我想知道在原始媒体中,节点从偏移量13开始,并且更重要的是,“text”从偏移量18开始。
标准Java XML解析器可以实现这个功能吗?JAXB呢?如果没有简单的解决方案,需要在解析路径上进行哪些类型的更改才能实现此功能?
我想将一些格式良好的XML解析成DOM,但我想知道每个节点标记在原始媒体中的偏移量。
例如,如果我有一个XML文档,内容类似于:
<html>
<body>
<div>text</div>
</body>
</html>
我想知道在原始媒体中,节点从偏移量13开始,并且更重要的是,“text”从偏移量18开始。
标准Java XML解析器可以实现这个功能吗?JAXB呢?如果没有简单的解决方案,需要在解析路径上进行哪些类型的更改才能实现此功能?
org.xml.sax.Locator
接口。当您使用SAX API时,您需要继承DefaultHandler
并将其传递给SAX解析方法,SAX解析器实现会通过setDocumentLocator()
向您的DefaultHandler
注入一个Locator
。随着解析的进行,您的ContentHandler
上的各种回调方法被调用(例如startElement()
),此时您可以查看Locator
以获取解析位置(通过getColumnNumber()
和getLineNumber()
)。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();
}