使用SAX解析xml文件
来源:互联网 发布:软件接口测试 编辑:程序博客网 时间:2024/06/14 22:17
使用JAXP进行SAX解析(XMLReaderFactory、XMLReader 、SAXParserFactory与SAXParser)
一.我们通过XMLReaderFactory、XMLReader完成,步骤如下
1.通过XMLReaderFactory创建XMLReader对象 XMLReader reader = XMLReaderFactory.createXMLReader(); 2. 设置事件处理器对象 reader.setContentHandler(new MyDefaultHandler()); 3.读取要解析的xml文件 FileReader fileReader =new FileReader(new File("src\\sax\\startelement\\web.xml")); 4.指定解析的xml文件 reader.parse(new InputSource(fileReader));
案例:通过案例对uri、localName、qName和attribute参数有更加深入的了解
1.首先创建要解析的web.xml文件,内容如下
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns:csdn="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <csdn:display-name></csdn:display-name> </web-app> <!-- uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 xml namespace-xmlns localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 -->
2.创建解析测试类及事件处理的内部类代码如下
package sax.startelement; import java.io.File; import java.io.FileReader; import org.junit.Test; 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; import org.xml.sax.helpers.XMLReaderFactory; public class Demo3 { @Test public void test() throws Exception { // 通过XMLReaderFactory创建XMLReader对象 XMLReader reader = XMLReaderFactory.createXMLReader(); // 设置事件处理器对象 reader.setContentHandler(new MyDefaultHandler()); // 读取要解析的xml文件 FileReader fileReader = new FileReader(new File( "src\\sax\\startelement\\web.xml")); // 指定解析的xml文件 reader.parse(new InputSource(fileReader)); } // 自定义的解析类,通过此类中的startElement了解uri,localName,qName,Attributes的含义 class MyDefaultHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); System.out .println("--------------startElement开始执行--------------------------"); System.out.println("uri:::" + uri); System.out.println("localName:::" + localName); System.out.println("qName:::" + qName); for (int i = 0; i < attributes.getLength(); i++) { String value = attributes.getValue(i);// 获取属性的value值 System.out.println(attributes.getQName(i) + "-----" + value); } System.out .println("------------------startElement执行完毕---------------------------"); } } }
3.程序运行的结果如下:
二.我们通过SAXParserFactory、SAXParser、XMLReader完成,步骤如下
1.使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
2.通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
3.通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
4.设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
5.解析xml文件
xmlReader.parse("book.xml");
只是使用SAXParserFactory、SAXParser他们完成只需要如下3步骤
1.获取sax解析器的工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
2.通过工厂对象 SAXParser创建解析器对象
SAXParser saxParser = factory.newSAXParser();
3.通过解析saxParser的parse()方法设定解析的文件和自己定义的事件处理器对象
saxParser.parse(new File("src//sax//sida.xml"), new MyDefaultHandler());
案例:解析出"作者"元素标签中的文本内容
1.需要解析的sida.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 四大名著[ <!ELEMENT 四大名著 (西游记,红楼梦)> <!ATTLIST 西游记 id ID #IMPLIED> ]> <四大名著> <西游记 id="x001"> <作者>吴承恩</作者> </西游记> <红楼梦 id="x002"> <作者>曹雪芹</作者> </红楼梦> </四大名著>
2.解析测试类和事件处理器类的实现代码
package sax; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxTest { @Test public void test() throws Exception { // 1.获取sax解析器的工厂对象 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2.通过工厂对象 SAXParser创建解析器对象 SAXParser saxParser = factory.newSAXParser(); // 3.通过解析saxParser的parse()方法设定解析的文件和自己定义的事件处理器对象 saxParser.parse(new File("src//sax//sida.xml"), new MyDefaultHandler()); } // 自己定义的事件处理器 class MyDefaultHandler extends DefaultHandler { // 解析标签开始及结束的的标识符 boolean isOk = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); // 当解析作者元素开始的时候,设置isOK为true if ("作者".equals(qName)) { isOk = true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); // 当解析的标识符为true时,打印元素的内容 if (isOk) { System.out.println(new String(ch, start, length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); // 当解析作者元素的结束的时候,设置isOK为false if ("作者".equals(qName)) { isOk = false; } } } }
3.程序运行结果如下:
- 使用SAX解析XML文件(SAX解析)
- 使用SAX解析XML文件
- 使用sax解析xml文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用sax解析xml文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析XML文件
- 使用SAX解析xml文件
- 使用SAX解析XML文件
- 深入浅出解释FFT(四)——fft分析信号频率和相位
- webpack 热部署
- POJ-3436-ACM Computer Factory(网络流)
- CF
- Windows虚拟地址空间
- 使用SAX解析xml文件
- (三)深入了解Struts2
- Windows的文件系统
- 最通俗易懂的01背包问题讲解
- java迷你DVD管理器源代码
- Could not resolve type alias 微服务启动时的报错
- JavaScript简单综合总结
- [算法] 字符串
- 1294 全排列