xml代码
<?xml version="1.0" encoding="UTF-8"?>
<pets>
<dogs>
<dog id="1" >
<name>YAYA</name>
<health>100</health>
<love>0</love>
<strain>酷酷的雪娜瑞</strain>
</dog>
<dog id="2">
<name>OUOU</name>
<health>90</health>
<love>15</love>
<strain>聪明的拉布拉多犬</strain>
</dog>
</dogs>
</pets>
bean
package test20141213;
public class Dog {
public int id;
public String name;
public int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Dom
1.我们可以通过DocmentBuilder解析一个xml文件获得文档树,通过文档树获得其根节点的子节点。
2.可以直接把属性直接写在节点标签内,通过node.getAttribute().getNamedItem("指定的属性").getTextContent();来获取对应的属性值
就像这样
<dog id="1" >
</dog>
3也可以把值写在其子节点里,先获取其dog节点的集合,通过for循环得到每个节点的子节点,在循环判断每个节点的nodeName,通过getTextContent()方法获取到值
就像这样
<name>YAYA</name>
<health>100</health>
<love>0</love>
<strain>酷酷的雪娜瑞</strain>
下面是Dom方式解析xml文件代码
package test20141213;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class demo1 {
public static void main(String[] args) {
domParseTest();
}
public static void domParseTest(){
DocumentBuilderFactory dbf=null;
DocumentBuilder db=null;
Document doc=null;
List<Dog> doglist=new ArrayList<Dog>();
try {
dbf=DocumentBuilderFactory.newInstance();
db=dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
}
try {
doc = db.parse(new File("pet.xml"));
} catch (SAXException e1) {
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
//得到文档树根节点
Element e=doc.getDocumentElement();
//得到标签名为dog的节点集合
NodeList petList=e.getElementsByTagName("dog");
//遍历节点集合
System.out.println(petList.getLength());
for(int i=0;i<petList.getLength();i++){
Dog dog=new Dog();
Node node=petList.item(i);
String id=node.getAttributes().getNamedItem("id").getTextContent();
System.out.println("dog的id属性是:"+id);
/*
* 得到其属性集合,得到指定属性的值
* <pets>
<dogs>
<dog id="1" >
<name>YAYA</name>
<age>100</age>
</dog>
<dog id="2">
<name>OUOU</name>
<age>102</age>
</dog>
</dogs>
</pets>
得到node的Attribute是dog标签里的id,想要得到其子标签的值需要getChildNodes
*/
dog.setId(Integer.parseInt(node.getAttributes().getNamedItem("id").getTextContent()));
/*
* 得到子节点集合
* 通过子节点的getNodeName判断是哪一个标签
* 然后给这个标签的字段赋值
*/
NodeList childNodeList=node.getChildNodes();
for(int j=0;j<childNodeList.getLength();j++){
Node childNode=childNodeList.item(j);
if(childNode.getNodeName().equals("name"))
dog.setName(childNode.getTextContent());
if(childNode.getNodeName().equals("age"))
dog.setAge(Integer.parseInt(childNode.getTextContent()));
}
doglist.add(dog);
}
for(Dog d:doglist){
System.out.println(d);
}
}
}
sax解析
1.sax解析首先要先继承defaultHandler,主要注意有五个主要的触发器
package test20141213;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class PetHanlder extends DefaultHandler {
public void startDocument() throws SAXException {
}
public void startElement(String uri, String localName, String qName,Attributes attrs) throws SAXException {
}
public void characters(char[] ch, int start, int length)throws SAXException {
}
public void endElement(String uri, String localName, String qName)throws SAXException {
}
public void endDocument() throws SAXException {
}
}
<!-- 这里开始触发startDocument -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 每解析一个标签的开始触发startElement -->
<pets>
<dogs>
<dog id="1" >
<name><!--这里触发character事件-->
<span style="white-space:pre"> </span>YAYA
<span style="white-space:pre"> </span></name>
<age>100</age>
</dog>
<dog id="2">
<name>OUOU</name>
<age>102</age>
</dog>
</dogs>
<!-- 解析到闭标签时触发endElement -->
</pets>
<!-- 这里开始触发endDocument -->
2.建立sax解析器思路,设置state为none ,思路可以是当触发startDocument时,建立对象集合。当触发startElement时,判断标签名是不是对象,如果是建立对象,如果不是更改state为name或者age。触发character事件时,如果state是none就return,否则找到相应的state赋值。触发endElement时,判断如果标签名是对象就把对象添加到集合里。
下面开始建立解析器
1)建立petEnumState(不建立也可以,主要为了可读性强)
public enum PetEnumState {
name,age,none
}
2)建立解析器
package test20141213;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class PetHanlder extends DefaultHandler {
List<Dog> list=null;
Dog dog=null;
//赋标签值状态,如果标签里没有值则为none
PetEnumState state=PetEnumState.none;
//通过解析器返回集合
public List<Dog> getDogs() {
return this.list;
}
public void startDocument() throws SAXException {
//开始读节点树的时候开始建立对象集合
list=new ArrayList<Dog> ();
}
public void startElement(String uri, String localName, String qName,Attributes attrs) throws SAXException {
//如果标签名是dog,则创建对象
if(qName.equals("dog"))
{
dog=new Dog();
return;
}
if(qName=="name")
{
state=PetEnumState.name;
return;
}
if(qName=="age")
{
state=PetEnumState.age;
return;
}
}
public void characters(char[] ch, int start, int length)throws SAXException {
//如果状态是none直接退出
if(state.equals("none"))
return ;
String content=new String(ch,start,length);
//如果有状态则给对象赋值
switch(state){
case name:
dog.setName(content);
state=PetEnumState.none;
break;
case age:
dog.setAge(Integer.parseInt(content));
state=PetEnumState.none;
break;
default:
break;
}
}
//如果读到dog结束标签,则给list添加对象,并且清空dog
public void endElement(String uri, String localName, String qName)throws SAXException {
if(qName.equals("dog")){
list.add(dog);
dog=null;
}
}
public void endDocument() throws SAXException {
//没有用到
}
}
建立测试类
package test20141213;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxParseTest {
public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance(); // 创建SAX解析器工厂
try {
SAXParser parser = factory.newSAXParser();
PetHanlder petHandler = new PetHanlder();
// URL url = new
// URL("http://rss.sina.com.cn/news/world/focus15.xml");
// InputSource is = new InputSource(url.openStream());
// parser.parse(is, rssHandler); // 开始解析
// 生成一个具体的SAX解析器
// local parse
parser.parse("pet.xml", petHandler); // 开始解析
List<Dog> dogs = petHandler.getDogs();
for (Dog dog : dogs) {
System.out.println(dog);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}