学习了该方式解析xml,发现一个问题,目前不明白。现在提供出代码,供大家参考。
代码给出了解析代码,xml文档;至于实体类代码,就不写了。问题也在代码中体现。具体在startElement()方法中,注释体现。
发现:
当加入换行代码后,读取不到name值,反之即可。
鄙人小菜一只,在此恭迎大佬解答。
以下是解析代码:
package com.hmh.server.basic;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XmlTest02 {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//获取解析工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//从工厂获取解析器
SAXParser parser = saxParserFactory.newSAXParser();
//编写处理器
//加载处理器
PersonHandler personHandler = new PersonHandler();
//解析开始
parser.parse(
Thread.currentThread().getContextClassLoader().getResourceAsStream("com/hmh/server/basic/p.xml"),
personHandler);
//输出从xml文档中读取到的数据
System.out.println(personHandler.getPersons());
/*String str = "";
int parseInt = Integer.parseInt(str);
Integer valueOf = Integer.valueOf(str);*/
}
}
/**
* 编写的处理器,储存解析得到的数据
* @author HMH
* @data
* @remark
*/
class PersonHandler extends DefaultHandler{
//存储对象列表
private List<Person> persons;
private Person person;
private String tag;
/**
*文档解析开始,该方法只执行一次
*/
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<>();
}
/**
* 标签解析开始
* qName是标签名
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName + "---->解析开始");
if(null != qName){
tag = qName;
if(tag.equals("person"))
//System.out.println(); //加了一个换行读取出错了
person = new Person();
}
}
/**
* 获取标签内容
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch,start,length).trim();
if(null != tag){
if("name".equals(tag)){
person.setName(content);
}else if("age".equals(tag)) {
if(content.length() > 0){
person.setAge(Integer.parseInt(content));
}
}
}
}
/**
* 解析标签完成
* 完成后将对象加入到list中
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println( qName+ "结束" + qName);
if(null != qName){
if("person".equals(qName)){
System.out.println(person.getName());
persons.add(person);
}
}
//每次标签完成后,丢弃结束标签
tag = null;
}
/**
* 文档解析结束
*/
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束...");
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
以下是xml文件中的数据:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>mmm</name>
<age>25</age>
</person>
<person>
<name>nnn</name>
<age>55</age>
</person>
</persons>