您的位置:首页 > 编程语言 > Java开发

JAVA解析XML文件(二)---SAX方式解析

2015-11-22 19:22 417 查看
JAVA解析XML文件(二)—SAX方式解析

1.XML文件内容:

<?xml version="1.0"  encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>乔治·马丁</author>
<year>2015</year>
<price>200</price>
</book>
<book id="2">
<name>光荣与梦想</name>
<year>2004</year>
<price>150</price>
<publish>科学出版社</publish>
</book>
</bookstore>


2.JAVA代码:

(1)新建一个类对Handler方法重写

public class SAXParserHandler extends DefaultHandler {
int bookIndex = 0;
String value = null;
Book book = null;
private ArrayList<Book> bookList = new ArrayList<Book>();

public ArrayList<Book> getBookList() {
return bookList;
}

/**
* 用来标示解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("解析开始");
}

/**
* 用来标示解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("解析完成");
}

/**
* 用于遍历xml的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")) {
bookList.add(book);
book = null;
bookIndex++;
// 创建一个Book对象,用来接收解析到的元素和节点
book = new Book();
System.out.println("================开始遍历第" + bookIndex
+ "本书的内容=================");
// //已知book标签有有一个属性为id时,调用getValue方法即可
// String value = attributes.getValue("id");
// System.out.println("book标签的属性值为:"+ value);

// 不知道book标签的属性及个数时,可通过索引遍历,方法如下
int num = attributes.getLength();
System.out.println("book标签共有" + num + "个属性:");
for (int i = 0; i < num; i++) {
// 通过遍历索引来获取属性的名称和值
System.out.print("第" + (i + 1) + "个属性的名称是:"
+ attributes.getQName(i));
System.out.println("--->它的属性值是:" + attributes.getValue(i));

// 将获取的属性值赋给book对象中的id属性
if (attributes.getQName(i).equals("id")) {
book.setId(attributes.getValue(i));
}
}
}

else if (!(qName.equals("book") || qName.equals("bookstore"))) {
// 获取节点名
System.out.print("节点名是:" + qName);
// 将获取到的节点属性值赋给相应的节点
}
}

/**
* 用于遍历xml的结束标签
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if (qName.equals("book")) {
book = null;
System.out.println("================结束遍历第" + book
4000
Index
+ "本书的内容=================");
} else if (qName.equals("")) {
System.out.println("出错了,写的什么屎玩意儿!!!");
} else if (qName.equals("name")) {
book.setName(value);
//  System.out.println("名称已写入"+book.getName());
} else if (qName.equals("author")) {
book.setAuthor(value);
} else if (qName.equals("year")) {
book.setYear(value);
} else if (qName.equals("price")) {
book.setPrice(value);
} else if (qName.equals("publish")) {
book.setPublish(value);
}
}

/**
* 用于获取节点的值
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
// 获取节点值
value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println("--->它的值是:" + value);
}
}


(2)新建SAX解析方法进行解析

public ArrayList<Book> SAXParseXML() {
// 通过SAXParserFactory的newInstance方法创建一个实例
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParserHandler handler = null;
try {
// 通过factory的newSAXParser方法创建一个SAXParser实例
SAXParser parser = factory.newSAXParser();
// 创建一个SAXParserHandler对象,SAXParserHandler类继承自DefaultHandler,里边重载了一些方法
handler = new SAXParserHandler();
// 通过parser的parse方法解析目标xml文件
parser.parse("MyXML.xml", handler);
return handler.getBookList();

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return handler.getBookList();

}


(3)main()方法调用

public static void main(String[] args) {

SAXTest st = new SAXTest();
st.SAXParseXML();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java xml SAX