javaweb学习总结十二(JAXP对XML文档进行SAX解析)

一:JAXP使用SAX方式解析XML文件

1:dom解析与sax解析异同点

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

2:sax解析特点

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

二:代码案例

1:xml文件

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student>
<name sid="111">李四</name>
<age>23</age>
<gender>男</gender>
</student>
<student>
<name sid="222">张三</name>
<age>21</age>
<gender>女</gender>
</student>
</students>

2:测试主体部分

 @Test
public void testParseXml() throws ParserConfigurationException,
SAXException, IOException {
// 1:获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2:获取解析器
SAXParser parser = factory.newSAXParser();
// 3:获取读取器
XMLReader reader = parser.getXMLReader();
// 4:设置内容格式
reader.setContentHandler(new GetSecondNameHandler());
// 5:解析文件
reader.parse("xml/exam.xml");
}

a:获取整个xml文档标签的处理事件

 // 定义一个解析全文的解析器
class MyHandler implements ContentHandler { @Override
public void setDocumentLocator(Locator locator) { } @Override
public void startDocument() throws SAXException { } @Override
public void endDocument() throws SAXException { } @Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException { } @Override
public void endPrefixMapping(String prefix) throws SAXException { } @Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.println("<" + qName + ">");
// 获取元素的属性
for (int i = 0; i < atts.getLength(); i++) {
String attrName = atts.getQName(i);
String attrValue = atts.getValue(i);
System.out.println(attrName + "=" + attrValue);
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("<" + qName + "/>");
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch, start, length));
} @Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException { } @Override
public void processingInstruction(String target, String data)
throws SAXException { } @Override
public void skippedEntity(String name) throws SAXException { } }

b:定义“获取指定内容,获取第二个学生的名字”事件

 class GetSecondNameHandler extends DefaultHandler {

     private String contentTag;
private int currentTag = 0;
private int getTag = 2; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
contentTag = qName;
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
contentTag = null;
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("name".equals(contentTag)) {
currentTag++;
if (currentTag == getTag) {
System.out.println(new String(ch, start, length));
} }
} }

c:将xml信息封装成javabean对象,然后放到list集合中

 / 将xml中student元素内容封装成对象,然后放到list集合中
class BeanListHandler extends DefaultHandler {
private List<Student> list = new ArrayList<Student>();
private String tagName;
private Student stu; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = qName;
if ("student".equals(tagName)) {
stu = new Student();
}
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException { if ("name".equals(tagName)) {
stu.setName(new String(ch, start, length));
}
if ("age".equals(tagName)) {
stu.setAge(Integer.parseInt(new String(ch, start, length)));
}
if ("gender".equals(tagName)) {
stu.setGender(new String(ch, start, length));
} } @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("student".equals(qName)) {
list.add(stu);
stu = null;
} tagName = null;
} public List<Student> getStudents() {
return list;
} }

测试程序代码修改为:

 @Test
public void testParseXml() throws ParserConfigurationException,
SAXException, IOException {
// 1:获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2:获取解析器
SAXParser parser = factory.newSAXParser();
// 3:获取读取器
XMLReader reader = parser.getXMLReader();
// 4:设置内容格式
BeanListHandler beanListHandler = new BeanListHandler();
reader.setContentHandler(beanListHandler);
// 5:解析文件
reader.parse("xml/exam.xml"); List<Student> list = beanListHandler.getStudents();
for (Student stu : list) {
System.out.println("name=" + stu.getName() + " age=" + stu.getAge()
+ " gender=" + stu.getGender());
}
}
上一篇:asp.net中ashx生成验证码代码放在Linux(centos)主机*问时无法显示问题


下一篇:支持向量机(SVM)算法