1:什么是xml文件
xml文件是可扩展性标记语言
xml作为数据传输,存储和配置文件的一种格式,开发中会大量使用,核心是掌握XML的解析方法
2:特点
xml文件和操作系统,编程语言的开发平台
实现不同系统之间的数据交换
3:作用
数据交换
配置应用程序和网站
Ajax基石
4:XML文件解析方法
DOM解析
基于xml文档树结构的解析
适合于多次访问的xml文档
特点:消耗资源过多
DOM解析xml文件的步骤:
1: DocumentBuilderFactory dbf= DocumentBuilderFactory .newIstance(); 创建解析器工厂对象
2: DocumentBuilder db= dbf.newDocumentBuilder();
解析器工厂对象创建解析器对象
3: Document document= db.parse(path);
解析器对象指定xml文件创建Document对象
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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Demo01 {
/**
* 将XML文件转换成Document对象
* 查询节点数据
* DOM解析的特点:
* 1:基于树型结构,通过解析器一次性吧文档加载到内存中去,适合随机读取
* 2:比较灵活,更适合在WEB中开发
*/
public static void main(String[] args) {
//创建工厂对象,因为DocumentBuilderFactory是一个抽象类,需要使用方法来声明
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//使用方法获得解析器的对象
DocumentBuilder db= factory.newDocumentBuilder();
//已经将文件解析成XML文件中,并存储到内存中去(以 树状的形式)
Document document=db.parse("收藏信息1.xml");
//读取数据,获取元素标签名称
NodeList n=document.getElementsByTagName("Brand");
//遍历,循环执行两次
for (int i = 0; i < n.getLength(); i++) {
Node node=n.item(i);//XML文件中节点的表达形式,NodeList 接口提供对节点的有序集合的抽象,需要强转为element类型
Element brand=(Element)node;//强制类型转换为Element
String nameValue=brand.getAttribute("name");//通过名称获得属性值
System.out.println(nameValue);
NodeList childName=brand.getChildNodes();
//遍历子节点
for (int j = 0; j < childName.getLength(); j++) {
Node node1=childName.item(j);//XML文件中节点的表达形式
//判断类型是否相等,只有相等才能进行类型转化
if(node1.getNodeType()==Node.ENTITY_NODE){
Element type=(Element)node1;
String typeValue=type.getAttribute("name");
System.out.println("\t"+typeValue);
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SAX解析
基于事件的解析
适用于大数据量的xml文档
特点:占用资源少,内存消耗少
DOM4J解析(使用较多的xml文件解析)
非常强大的Java xml API
性能优异,功能强大
开放源代码
DOM4J解析xml文件的步骤:
1:SAXReader sr=new SAXReader();
创建SAXReader对象
2:Docuemnt doc= sr.read(path);
SAXReader创建的对象调用read()方法获取Document数据并存储
3:Element root=doc.getRootElement();
使用doc调用getRootElement()方法获取xml的根节点
4:Iterator iterator= root.elementIterator();
存储到迭代器中
5: 遍历迭代器
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.Element;
public class dom4jParseXML {
public static Document doc;
public static void main(String[] args){
loadDocument();
// showPhoneInfo();
// addNewPhoneInfo();
updatePhoneInfo();
// deleteItem();
showPhoneInfo();
}
//读取xml文件
public static void loadDocument(){
try {
SAXReader saxReader=new SAXReader();
doc=saxReader.read(new File("收藏信息1.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
//获取文件信息
public static void showPhoneInfo(){
//获取根节点
Element root=doc.getRootElement();
//遍历根节点的所有子元素--遍历所有的brand标签
for (Iterator itBrand=root.elementIterator();itBrand.hasNext();) {//得到迭代器放到itBrand中去
Object object=itBrand.next();
Element brand=(Element)object;
System.out.println("品牌: "+brand.attributeValue("name"));
//遍历type便签
Iterator itType=brand.elementIterator();
while(itType.hasNext()){
Element type=(Element)itType.next();
System.out.println("\t型号"+type.attributeValue("name"));
}
}
}
//找到需要修改的节点
public static void updatePhoneInfo(){
//获取根节点
Element root=doc.getRootElement();
Iterator itBrand=root.elementIterator();
int id=0;
while(itBrand.hasNext()){
Element brand=(Element)itBrand.next();
if(brand.attributeValue("name").equals("小米")){
brand.addAttribute("name", "oppo");
}
}
saveXML("收藏信息1.xml");
}
//删除节点
public static void deleteItem(){
//获取根节点
Element root=doc.getRootElement();
Iterator itBrand=root.elementIterator();
while(itBrand.hasNext()){
Element brand=(Element)itBrand.next();
if(brand.attributeValue("name").equals("小米")){
//删除节点需要通过调用父节点来删除子节点
brand.getParent().remove(brand);
}
}
}
//存储xml文件
public static void saveXML(String path){
try {
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML编码
//将Writer对象或OutputStream对象作为目标,那么您可以使用XMLWriter该类
XMLWriter xw=new XMLWriter(new FileWriter(path),format);
xw.write(doc);
xw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
//添加一个节点
public static void addNewPhoneInfo(){
//获取根节点
Element root=doc.getRootElement();
//添加节点
Element brand=root.addElement("Brand");
brand.addAttribute("name", "小米");
//再添加子节点
Element type=brand.addElement("Type");
type.addAttribute("name","小米5.0");
saveXML("收藏信息1.xml");
}
}
收藏信息1.xml
<?xml version="1.0" encoding="GBK"?>
<PhoneInfo>
<Brand name="华为">
<Type name="U8650"/>
<Type name="HW123"/>
<Type name="HW321"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone4"/>
</Brand>
<Brand name="oppo">
<Type name="小米5.0"/>
</Brand>
</PhoneInfo>