一、对XML的认识
1、XML的用途:XML是一种文件类型,用于存储和传递信息
2、为什么要使用XML
- XML可以用于不同应用程序之间的通信,如订票软件和支付软件;
- XML可以用于不同平台间的通信,如Mac OS和Windows;
- XML可以用于不同间的数据共享,如网站和手机APP。
3、解析XML文件:就是在java程序中获取XML文件内容
4、解析XML文件的目的:获取XML文件的节点名、节点值、属性名、属性值
5、4种解析方式:DOM、SAX、DOM4J、JDOM解析
6、3种节点类型
二、使用DOM解析XML文件
1、先建一个xml文件,如“books.xml”
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>嫌疑人X的献身</name>
<author>东野圭吾</author>
<year>2017</year>
<price>45</price>
</book>
<book id="2">
<name>活着</name>
<year>2002</year>
<price>33</price>
<language>Chinese</language>
</book>
</bookstore>
2、新建一个java项目,将xml文件拷贝到工程目录下
3、写程序,实现DOM解析XML文件的功能
//使用DOM解析XML文件
package black.test.DOM_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.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMTest {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//创建一个DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
//加载books.xml文件到当前项目下(因为books.xml文件已拷贝到工程中,所以这里用相对路径就可以)
Document document=db.parse("books.xml");
//获取所有book节点的集合
NodeList bookList=document.getElementsByTagName("book");
//获取bookList的长度
System.out.println("一共有"+bookList.getLength()+"本书");
//遍历book的属性
for(int i=0;i<bookList.getLength();i++){
System.out.println("=========开始遍历第"+(i+1)+"本书=========");
// /**
// * 若已知只有一个属性,并且属性名为id
// */
// //取得book节点
// Element element=(Element)bookList.item(i);
// //取得book节点的属性的值
// String context=element.getAttribute("id");
// System.out.println("第"+(i+1)+"本书的属性值为:"+context);
//通过item(i)获取一个book节点
Node book=bookList.item(i);
//取得book节点的属性
NamedNodeMap map=book.getAttributes();
//获取属性集合的属性个数
System.out.println("第"+(i+1)+"本书共有"+map.getLength()+"个属性");
//遍历book节点的属性
for(int j=0;j<map.getLength();j++){
Node node=map.item(j);
System.out.println("属性名:"+node.getNodeName()+
",属性值:"+node.getNodeValue());
}
//解析book节点的子节点
NodeList childNodes=book.getChildNodes();
System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点");
for(int j=0;j<childNodes.getLength();j++){
Node node=childNodes.item(j);
//是element节点才输出 node.getTextContent()也可以获取节点值
if(node.getNodeType()==Node.ELEMENT_NODE){
System.out.println("第"+(j+1)+"个节点的节点名:"+node.getNodeName()+
",节点值:"+node.getFirstChild().getNodeValue());
}
}
}
}
}
4、程序运行结果