gpt4 book ai didi

java - SAX 究竟是如何解析文档的?

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:27 26 4
gpt4 key购买 nike

我试图通过简单地实现 org.xml.sax.ContentHandler 来解析我在 SAX 中的第一个 XML 文档,但我不知道我是否理解流程。对于给定的 XML 文档:

<?xml version="1.0"?>
<list>
<item>
<name>One</name>
<description>The number 1, expressed in letters.
</item>
<item>
<name>Two</name>
<description>The number 2, expressed in letters.
</item>
</list>

解析器中事件的预期顺序是什么?我的假设是否正确:

startDocument()
startElement() -> "list"

startElement() -> "item"
startElement() -> "name"
characters() (>=1 times) -> "One"
endElement() -> "name"
startElement() -> "description"
characters() (>=1 times) -> "The number 1, expressed in letters."
endElement() -> "description"
endElement() -> "item"

startElement() -> "item"
startElement() -> "name"
characters() (>=1 times) -> "Two"
endElement() -> "name"
startElement() -> "description"
characters() (>=1 times) -> "The number 2, expressed in letters."
endElement() -> "description"
endElement() -> "item"

endElement() -> "list"
endDocument()

这就是它的要点吗?

此外,最简单的解析方法是什么?目前,在每次调用 startElement 时,我都会将当前元素的名称保存为私有(private)变量,以便在 characters 调用中解析数据时使用。有没有更简单/更好的方法?

最佳答案

是的,您已经掌握了要点。

SAX 是一个非常低级的接口(interface),所以不要期望它很容易。在大多数 SAX 应用程序中,您可能希望维护一个堆栈,其中 startElement 将元素名称压入堆栈,endElement 将其弹出。如果您不处理混合内容,那么 characters() 可能应该附加到与堆栈顶部的元素关联的 StringBuffer,并且您应该在 endElement 事件发生时处理 StringBuffer 中的字符内容。这是因为字符内容可以按照解析器所需的任何方式拆分为对 characters() 的多个调用。

关于java - SAX 究竟是如何解析文档的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687300/

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