gpt4 book ai didi

java - SAX 解析器是否将所有数据保存在内存中?

转载 作者:行者123 更新时间:2023-12-02 01:36:45 28 4
gpt4 key购买 nike

我正在满足一项要求,即我需要拆分大型 XML 并进一步处理。

这是 XML 示例,它可以变成单行。

<?xml version="1.0"?><company><staff><firstname>yong</firstname><firstname>jin</firstname></staff></company>

这是我的代码:

import java.util.Arrays;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXML {

public static void main(String argv[]) {

try {

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

DefaultHandler handler = new DefaultHandler() {

boolean bfname = false;
boolean blname = false;
boolean bnname = false;
boolean bsalary = false;

public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {

System.out.println("Parameters :" + uri +":"+ localName +":"+ qName +":"+ attributes);
System.out.println("Start Element :" + qName);

if (qName.equalsIgnoreCase("FIRSTNAME")) {
bfname = true;
}

if (qName.equalsIgnoreCase("LASTNAME")) {
blname = true;
}

if (qName.equalsIgnoreCase("NICKNAME")) {
bnname = true;
}

if (qName.equalsIgnoreCase("SALARY")) {
bsalary = true;
}

}

public void endElement(String uri, String localName,
String qName) throws SAXException {

System.out.println("End Element :" + qName);

}

public void characters(char[] ch, int start, int length) throws SAXException {

System.out.println("Im here:"+Arrays.toString(ch));----Line 1
if (bfname) {
System.out.println("First Name : " + new String(ch, start, length));
bfname = false;
}

if (blname) {
System.out.println("Last Name : " + new String(ch, start, length));
blname = false;
}

if (bnname) {
System.out.println("Nick Name : " + new String(ch, start, length));
bnname = false;
}

if (bsalary) {
System.out.println("Salary : " + new String(ch, start, length));
bsalary = false;
}

}

};

saxParser.parse("C:\\Lenny\\Work\\XML\\SaxParsing_01.xml", handler);



/*InputSource input = new InputSource("C:\\Lenny\\Work\\XML\\SaxParsing_01.xml");
System.out.println(input);
XMLReader reader = saxParser.getXMLReader();
reader.parse(input);*/


} catch (Exception e) {
e.printStackTrace();
}

}

}

我的第一个疑问是,SAXParser 是否明智地读取字节?

其次,我想要这样的输出。

<firstname>yong</firstname>
<firstname>jin</firstname>

这件事我可以处理,但想知道..当我得到<firstname>时标记并进入 characters方法,为什么它打印所有整个 XML ?不应该打印 yong仅在 Line 1而不是打印整个 XML?它全部打印出来,所以这就是我想的原因,确实SAXParser是否将整个数据保留在内存中?

任何建议请..!

谢谢

最佳答案

Does SAX Parser keeps all data in Memory?

不,这就是重点。将 XML 文档的整个 DOM 数据加载到内存中,然后从中提取您想要的内容,比使用 SAX 麻烦的模型要容易得多。

但是 SAX 具有即时读取文档的优点,而无需将其完全加载到内存中。

My First Doubt is, Does SAXParser reads bytes wise ?

不是按字节,不。这将是非常低效的,特别是考虑到 SAX 的本质就是对巨大的文档进行操作。这是一个缓冲读取。并不是说这会消耗太多内存。

Why its printing All whole XML ? Shouldn't it print yong only at Line 1 rather than printing whole XML ? Its printing all, So that's why am thinking, DOES SAXParser keep whole data in memory or not ?

参见上文,出于合理的性能原因,SAX 使用缓冲区进行读取。作为参数提供给characters()方法的char[]大致就是前面提到的缓冲区。

在您的示例中,您的文档很小,当然它将完全适合用于读取文档的现实世界缓冲区。如果您要处理更大的文档,您会注意到缓冲区包含数千个字符,但远不及整个文档。

关于java - SAX 解析器是否将所有数据保存在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55129320/

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