java - SAX 解析器如何工作?

标签 java xml dom sax

我是 XML 解析新手。在执行一项需要解析大 XML 文件的任务时。因此,在尝试制定一个好的解决方案时,我遇到了这两个术语:DOM 和 SAX。这都是两种不同类型的 XML 解析。我对 SAX 解析有点困惑。读了很多但仍然很困惑。

让我们以下面的 XML 为例

 <?xml version="1.0" encoding="UTF-8"?>
<note>
     <Desc>
       <to>Tove</to>
       <from>Jani</from>
       <heading>Reminder</heading>
       <body>Don't forget me this weekend!</body>
     </Desc>
     <Desc>
       <to>Tove</to>
       <from>Jani</from>
       <heading>Reminder</heading>
       <body>Don't forget me this weekend!</body>
     </Desc>
     <Desc>
       <to>Tove</to>
       <from>Jani</from>
       <heading>Reminder</heading>
       <body>Don't forget me this weekend!</body>
     </Desc>
</note>

可以说,我只想全部阅读 <body>标记并写入文件。

我的疑问:

  1. 如果我使用 DOM 解析器执行此操作,它会首先将所有 xml 加载到内存中,然后查找 <body>标记并写入文件?

  2. 如果我使用 SAX 解析器执行此操作,它会查找 <body>首先在磁盘上标记自己,当它找到它时,它就会开始从那里读取并继续加载到内存中,直到 </body>

  3. 如果2个疑问是正确的,那么这种读取是如何发生的? SAX 解析器是否逐字读取并将该字保留在内存中一段时间​​并检查是否与代码正在查找的标签匹配?因为标签的识别只能在内存中完成,但无处可做,这就是我的想法。并继续从内存中删除单词,直到找到选定的匹配项或标签 <body> 。一旦找到它,它就会开始将所有单词保存在内存中,直到找到 </body>

正确吗?
请纠正我..!

最佳答案

StAX(或拉解析器)将更适合您描述的用例。 DOM 读取整个文档,SAX 解析器生成您需要处理的事件,它们不在内存中存储任何内容(除了它们的内部)。使用 SAX,您需要使用 certain methods 实现内容处理程序。这也意味着您需要维护事件流的状态。例如,您发布的文档的第一 block 将生成以下(简化的)事件:

startDocument
startElement(note)
startElement(Desc)
startElement(to)
characters(Tove) // might come as multiple chunks
endElement(to)
...
endDocument

因此,您需要检查 startElement 标签名称是否为 body (如果您只需要 note -> Desc 中的 body 元素> 那么您需要跟踪所有开始/结束元素)并设置一个标志。在characters中,如果标志为true,则收集标签文本内容(或将其写入磁盘)。此外,在 endElement 中,需要将标志设置为 false 以避免从其他标记收集字符。

关于java - SAX 解析器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470561/

相关文章:

java - 如何编写可以对所有必要字段进行排序的通用比较器?

java - 由于 PendingIntent Flag 错误,Main Activity 无法启动

c# - 调用函数可以关闭 xml 阅读器资源吗

java - 使用批处理作业的 FlatFileItemReader 和 FlatFileItemWriter

javascript - 虚拟 DOM 的比较算法是否能够找出唯一的差异并修补真实 DOM?

java - SolrJ 无效的内容类型

JavaFX - 对象数据到 TableView

xml - 使用 xslt 转换多个 xml 模式文档

java - DocumentBuilder 线程安全吗?

javascript - 多个父节点在 Internet Explorer 7 中不起作用