gpt4 book ai didi

java - 如何使用 SAX 获取 xml 标记的正确开始/结束位置?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:50 25 4
gpt4 key购买 nike

SAX 中有一个定位器,它跟踪当前位置。但是,当我在 startElement() 中调用它时,它总是返回 xml 标记的结束位置。

如何获取标签的起始位置?有没有办法优雅地解决这个问题?

最佳答案

不幸的是,org.xml.sax 包中的 Java 系统库提供的 Locator 接口(interface)不允许根据定义提供有关文档位置的更多详细信息。引用自documentation getColumnNumber 方法(我添加的亮点):

The return value from the method is intended only as an approximation for the sake of diagnostics; it is not intended to provide sufficient information to edit the character content of the original XML document. For example, when lines contain combining character sequences, wide characters, surrogate pairs, or bi-directional text, the value may not correspond to the column in a text editor's display.

根据该规范,您将始终根据 SAX 驱动程序的最大努力获得“与文档事件关联的文本之后的第一个字符”的位置。因此,对问题第一部分的简短回答是:不,Locator 不提供有关标记起始位置的信息。此外,如果您在文档中处理多字节字符,例如中文或日文文本,您从 SAX 驱动程序获得的位置可能不是您想要的。

如果您需要标签的精确位置,或者想要有关属性、属性内容等的更细粒度的信息,则必须实现您自己的位置提供程序。

由于涉及所有潜在的编码问题、Unicode 字符等,我想这是一个太大的项目,无法在此处发布,实现也将取决于您的具体要求。

只是个人经验的快速警告:围绕传递给 SAX 解析器的 InputStream 编写一个包装器是危险的,因为您不知道 SAX 解析器何时会根据它的内容报告它的事件已经从流中读取。

您可以首先在 ContentHandlercharacters(char[], int, int) 方法中自己进行一些计数,方法是检查换行符、制表符等,除了使用 Locator 信息,这应该让您更好地了解您在文档中的实际位置。通过记住上一个事件的位置,您可以计算出当前事件的开始位置。不过要考虑到,您可能看不到所有换行符,因为它们可能出现在您不会在 characters 中看到的标签内,但您可以从 Locator 中推断出这些换行符信息。

关于java - 如何使用 SAX 获取 xml 标记的正确开始/结束位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1077865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com