【发布时间】:2019-03-12 19:27:31
【问题描述】:
我正在处理一个需求,我需要拆分大型 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 ?它不应该只在Line 1 打印yong 而不是打印整个XML 吗?它全部打印,所以这就是为什么我在想,SAXParser 是否将整个数据保存在内存中?
任何建议请..!
谢谢
【问题讨论】: