Java解析HTML

关于解析XML主要介绍三种方式,DOM,SAX,Pull 在Android优先使用SAX解析,PC一般使用DOM解析,因为DOM解析XML是吧整个XML加载到内存中,快,单占用内存。(Android 能省一点是一点)

<?xml version="1.0" encoding="UTF-8"?>  
<persons>  
    <person id = "23">  
        <name>张老师</name>  
        <age>21</age>  
    </person>  
    <person id = "20">  
        <name>李老师</name>  
        <age>25</age>  
    </person>  
</persons>  

这是我们今天要解析的XML

SAX解析XML

没什么好说的解析XML 直接上代码

public static void main(String[] args) {
		SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            SAXParserHandle handle = new SAXParserHandle();
            parser.parse("demo.xml", handle);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
	}

值得一说的就是SAXParserHandle,这个是自己创建的一个类继承与DefaultHandler

public class SAXParserHandle extends DefaultHandler {
    @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("----解析结束----");
    }

    @Override
    public void startElement(String arg0, String arg1, String name,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(arg0, arg1, name, attributes);
        if(name.equals("person")){
            System.out.println("==========开始遍历某一项的内容==========");
            int length = attributes.getLength();
            for(int i=0;i<length;i++){
                System.out.print("属性:"+attributes.getQName(i));
                System.out.println("---值:"+attributes.getValue(i));
            }
        }else if(!name.equals("person") && !name.equals("persons")){
            System.out.print("节点:"+ name);
        }
    }

    @Override
    public void endElement(String arg0, String arg1, String name)
            throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(arg0, arg1, name);
        if(name.equals("person")){
            System.out.println("==========结束遍历某一项的内容==========");
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        String nodeValue = new String(ch, start, length);
        if(!nodeValue.trim().equals("")){
            System.out.println("值:"+nodeValue);
        }
    }
}

继承完DefaultHandler之后重写几个方法,解析开始前执行的,结束后执行的,循环解析属性,结束循环的,循环解析值的。

PULL解析XML

利用Pull解析XML要导入Pull,jar包http://download.csdn.net/download/ttnuli/8080605 我贴出下载包,感谢CSDN某楼主分享

public static void main(String[] args) {
		try {
			XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();//构造工厂实例  
			XmlPullParser parser = xpf.newPullParser();//创建解析对象
			// 设置需要解析的XML数据  
			File file =new File("C://Users//Administrator//workspace//yanhao//XML//demo.xml");
			InputStream inStream=new FileInputStream(file);
			parser.setInput(inStream, "UTF-8"); 
			// 取得事件  
	        int event = parser.getEventType(); 
	        // 开始解析  
	        while (event != XmlPullParser.END_DOCUMENT){// 文档结束    
	            // 节点名称  
	            String nodeName = parser.getName();  
	            switch (event){  
	                case XmlPullParser.START_DOCUMENT: // 文档开始  
	                    System.out.println("开始解析");
	                    break;  
	                case XmlPullParser.START_TAG: // 标签开始  
	                    if ("person".equals(nodeName)){  
	                        String id = parser.getAttributeValue(0);  
	                        System.out.println("id="+id); 
	                    }  
	                    if ("name".equals(nodeName)){  
	                        String name = parser.nextText();  
	                        System.out.println("name="+name); 
	                    }  
	                    if ("age".equals(nodeName)){  
	                        int age = Integer.valueOf(parser.nextText());  
	                        System.out.println("age="+age);   
	                    }  
	                    break;  
	                case XmlPullParser.END_TAG: // 标签结束  
	                    if ("person".equals(nodeName)){  
	                       System.out.println("解析结束");  
	                    }  
	                    break;  
	            }  
	            event = parser.next(); // 下一个标签  
	        }  
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

SAX解析XML文件的方式大致相同,他们都是基于事件驱动的。XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。

DOM解析XML

Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。

public static void main(String[] args) {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	        DocumentBuilder builder = factory.newDocumentBuilder();;
	        File file =new File("C://Users//Administrator//workspace//yanhao//XML//demo.xml");
			InputStream inStream=new FileInputStream(file);
	        Document document = builder.parse(inStream);  
	        Element element = document.getDocumentElement();   
	        NodeList personNodes = element.getElementsByTagName("person");
	        for(int i=0;i<personNodes.getLength();i++){  
	            Element personElement = (Element) personNodes.item(i);  
	            System.out.println("id="+personElement.getAttribute("id"));
	            NodeList childNodes = personElement.getChildNodes();  
	            for(int j=0;j<childNodes.getLength();j++){  
	                if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){  
	                    if("name".equals(childNodes.item(j).getNodeName())){
	                        System.out.println("name="+childNodes.item(j).getFirstChild().getNodeValue());  
	                    }else if("age".equals(childNodes.item(j).getNodeName())){  
	                        System.out.println("age="+Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));  
	                    }  
	                }  
	            }
	        }
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}  
        
	}

值得一说的就是DOM解析配置文件还行,但是不要解析太大的数据。不然会吃不消的.....

转载于:https://my.oschina.net/yanhaohub/blog/3065905

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值