java dom 解析html_Java解析HTML

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

张老师

21

李老师

25

这是我们今天要解析的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

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

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

Element personElement = (Element) personNodes.item(i);

System.out.println("id="+personElement.getAttribute("id"));

NodeList childNodes = personElement.getChildNodes();

for(int j=0;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解析配置文件还行,但是不要解析太大的数据。不然会吃不消的.....

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值