xml文件以树形结构进行数据存储。
写xml文件前,需要在xml文件中声明,声明格式是`<?xml 版本="" 字符集=“”?>`
<?xml version="1.0" encoding="UTF-8"?>
<bookstore><!--此处为根节点,另外节点名称**区分大小写**-->
<book id="1"><!--子节点-->
<name>风来了</name>
<author>小黑</author>
<year>2016</year>
</book>
<book id="2">
...
</book>
</bookstore>
为什么要使用XML来存数信息
先思考以下问题:
所以xml的一个主要作用是,通过一个相同的xml文件把不同的东西连接起来
下面看一段代码。首先我们在电脑上打开一个记事本,如图,然后编写xml文件,单击保存之后,我们把后缀名改为.xml格式。
然后,打开Myeclipse,新建一个工程,工程名为DOMTest。我们可以把刚刚新建的xml文档直接拖拽到该工程名下即可,注意是工程名下,即DOMTest
下面贴出DOM解析代码
package com.iomooc.dmtest.test;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMTest {
/**
* @param args
*/
public static void main(String[] args) {
// 创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//创建一个DocumentBuilder对象
try {
DocumentBuilder db=dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parse(String fileName)方法加载books.xml文件到当前项目下
Document document=db.parse("books.xml");//相对路径
//获取book节点的集合
NodeList bookList=document.getElementsByTagName("book");
//遍历book节点集合
for(int i=0;i<bookList.getLength();i++){
System.out.println("========下面开始遍历第"+(i+1)+"本书的内容========");
Node book=bookList.item(i);
//遍历book属性
NamedNodeMap attrs=book.getAttributes();//获取book节点中的所有属性值
System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"种属性");
for(int j=0;j<attrs.getLength();j++){
Node attr=attrs.item(j);//获取book节点的某一个属性
//获取属性名
attr.getNodeName();
System.out.println("属性名:"+attr.getNodeName());
//获取属性值
System.out.println("属性值:"+attr.getNodeValue());
}
//解析book节点的子节点
NodeList childNodes=book.getChildNodes();
//遍历childNodes获取每个节点的节点名和节点值
//注意:空白和换行符算一个节点
//System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个节点");
for(int k=0;k<childNodes.getLength();k++){
//控制台输出#text就是空白和换行符 System.out.println(childNodes.item(k).getNodeName());
//通过if方法区分出text类型node和element类型的node
if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
//获取element类型节点的节点名
System.out.println(childNodes.item(k).getNodeName());
//获取element类型节点的节点值
System.out.println(childNodes.item(k).getFirstChild().getNodeValue());
//下面语句可同样达到上述效果
//System.out.println(childNodes.item(k).getTextContent());
//区别是 假如<name><a>新增加的内容</a>冰与火之歌</name>,后者可以把
//所有文本内容都可以获取到
}
}
System.out.println("========结束遍历第"+(i+1)+"本书的内容========");
}
}
catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}