SAX 中有一个定位器,它跟踪当前位置。但是,当我在 startElement() 中调用它时,它总是返回 xml 标记的结束位置。
如何获取标签的起始位置?有什么办法可以优雅地解决这个问题吗?
不幸的是,包Locator中 Java 系统库提供的接口org.xml.sax不允许提供有关定义的文档位置的更多详细信息。引用该方法的文档getColumnNumber(我添加的亮点):
该方法的返回值仅作为诊断时的近似值;它并不旨在提供足够的信息来编辑原始 XML 文档的字符内容。例如,当行包含组合字符序列、宽字符、代理对或双向文本时,该值可能与文本编辑器显示中的列不对应。
根据该规范,您将始终根据 SAX 驱动程序的最大努力获得“与文档事件关联的文本之后的第一个字符”的位置。因此,对问题第一部分的简短回答是:不,Locator不提供有关标签起始位置的信息。另外,如果您正在处理文档中的多字节字符(例如中文或日文文本),则从 SAX 驱动程序获得的位置可能不是您想要的。
如果您需要标签的精确位置,或者想要有关属性、属性内容等的更细粒度的信息,则必须实现自己的位置提供程序。
由于涉及所有潜在的编码问题、Unicode 字符等,我想这个项目太大了,无法在这里发布,实现也将取决于您的具体要求。
来自个人经验的一个快速警告:围绕InputStream您传递到 SAX 解析器的内容编写包装器是危险的,因为您不知道 SAX 解析器何时会根据它已从流中读取的内容报告其事件。
characters(char[], int, int)除了使用这些信息之外,您还可以首先按照自己的方法进行一些计数,ContentHandler检查换行符、制表符等Locator,这应该可以让您更好地了解您在文档中的实际位置。通过记住上一个事件的位置,您可以计算当前事件的开始位置。但请考虑到,您可能看不到所有换行符,因为这些换行符可能出现在您在 中看不到的标签内characters,但您可以从Locator信息中推断出这些换行符。
| 归档时间: |
|
| 查看次数: |
3526 次 |
| 最近记录: |