Java学习十一(操作xml文件)

java识别XML文件
常用的几种方式:

Dom解析/Sax解析/Dom4J解析/JDom解析

Dom方式(异常未处理):
public static void main(String [] args){
//实例化DocumentBuilderFactory对象
DcoumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//获得DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
//调用DocumentBuilder的parse()方法获得Document对象,parse方法有很多参数,具体可以查看api
Document d=db.parse("book.xml");
//获得你需要识别的元素节点的集合
NodeList bookList=d.getElementsByTagName("book");
for(int i=0;i<bookList.getLength();i++){
//调用getAttributes()方法,返回所有的属性集合
NamedNodeMap attr=bookList.item(i).getAttributes();
for(int j=0;j<attr.length;j++){
//通过NamedNodeMap的getNodeName()方法获取属性名字
System.out.print(attr.item(i).getNodeName());
//通过NamedNodeMap的getNodeValue()方法获取属性的值
System.out.print(attr.item(i).getNodeValue());
}
//如果知道该xml文件中有且只有一个id属性,可以不用循环,直接使用下面的方法
Element e=(Element)bookList.item(i);
System.out.print(e.getAttribute("id"));
//获得子节点下面的所有元素  注意:这里java默认会把换行也作为一个节点元素,所以下面的集合打印长度你会发现和你想要的不一样
NodeList childList =bookList.item(i).getChildNodes();
for(int j=0;j<childList.getLength();j++){
//排除掉集合中不是element的元素
if(childList.item(j).getNodeType ==NODE.ELEMENT_NODE){
//通过getNodeName()获取节点名字
System.out.print(childList.item(j).getNodeName());
//通过getFirstChild().getNodeValue()方法获取值,需要注意的是必须将值看做一个节点,来获取其中的值,否则直接使用getNodeValue() //获取的值为null;
System.out.print(childList.item(j).getFirstChild().getNodeValue());
//如果子节点下面有且只有一个文本内容,可以使用下面这个方法获取属性值
System.out.print(childList.item(j).getTextContent());
}
}
}
}
SAX方式(异常未处理):
原理:对xml文件内容一行一行进行解析
public static void main (String [] args){
//实例化SAXParserFactory对象
SAXParserFactory spf=SAXParserFactory.newInstance();
//实例化SAXParser对象
SAXParser sp=spf.newSAXParser();
//创建一个SAXHandler对象
SAXHandler sh=new SAXHandler();
//调用SAXParser的parse(File f,DefaultHandler dh)方法进行xml文件解析,此处需要一个DefaultHandler对象]
sp.parse("book.xml",sh);
//测试是否有将读取的数据保存起来
for (Book book : sh.getList()) {
System.out.println(book.getName());
System.out.println(book.getId());
}
}
由于我们需要按我们自己的方式显示xml文件内容,所以我们需要重写DefaultHandler的一些方法:
startElement(String uri, String localName, String qName, Attributes attributes);//解析xml元素开始
endElement(String uri, String localName, String qName);//解析xml元素结束
startDocument();endDocument();//解析xml文档开始、解析xml文档结束
characters(char[] ch, int start, int length);//获取节点的值
public class SAXHandler extends DefaultHandler(){
String value=null;
Book book=null;
private ArrayList<Book> list=new ArrayList<Book>();
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if(qName.equals("book")){
//创建Book对象
book=new Book();
//编定book标签下的所有属性
for(int i=0;i<attributes.getLenth();i++){
System.out.print(attributes.getQName(i));
System.out.print(attributes.getValue(i));
//如果属性名字和Book类中的id属性名一样,就进行赋值
if(attributes.getQName(i).equals("id")){
book.setId(Integer.parseInt(attributes.getValue(i)))
}
}
}
else if(!qName.equals("book")&&!qName.equals("bookstore")){
//打印二级节点
System.out.print(qName);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if(qName.equals("book")){
list.add(book);
book=null;
System.out.print("打印某本书结束");
}else if(qName.equals("name")){
book.setName(value);
}else if(qName.equals("author")){
book.setAuthor(value);
}else if(qName.equals("price")){
book.setPrice(Double.parseDouble(value));
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
value =new String(ch,start,length);
if(!value.trim().equals("")){
System.out.print(value);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析结束");
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("解析开始");
}
public ArrayList<Book> getList(){
return this.list;
}
public void SetList(ArrayList<Book> list){
this.list=list;
}
}
如果要将获取的xml文件数据保存起来,我们需要建立一个类
public class book{
private int id;
private String name;
private double price;
private String author;
public void setId(int id){
this.id=id;
}
public int getId(){
return this.id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setPrice(double price){
this.price=price;
}
public double getPrice(){
return this.price;
}
public void setAuthor(String author){
this.author=author;
}
public String getAuthor(){
return this.author;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值