我是 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>
标记并写入文件。
我的疑问:
如果我使用 DOM 解析器执行此操作,它会首先将所有 xml 加载到内存中,然后查找
<body>
标记并写入文件?如果我使用 SAX 解析器执行此操作,它会查找
<body>
首先在磁盘上标记自己,当它找到它时,它就会开始从那里读取并继续加载到内存中,直到</body>
?如果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/