1.什么是xml?
xml是可扩展标记语言的缩写,是一种简单的数据存储语言,使用一系列的标记来描述数据。
2.xml的特点
xml使用于操作系统无关,规范统一。
3.xml声明
<?xml version="1.0 encoding="utg-8"?>
version:文档复合xml1.0的规范
encoding:文档默认字符编码,默认为utf-8.
4.xml中的标签是成对出现,xml文件可以包含任意数量的标签。
5.xml文档的使用规则:
- 必须有xml声明语句。
- 必须且只有一个根元素
- 标签的大小写敏感,就是区分大小写
- 属性值用双引号包含起来
- 标签成对出现
- 元素正确嵌套
- 元素名称不能出现空格,不能以数字或者标点符号开头。
6.使用DOM解析XML文档
DOM是基于xml的数结构来完成解析的。
特点:比较消耗资源。
dom是文档对象模型的简称,以根元素为节点,每个节点都是以对象的形式存在。
解析代码如下:
public class Test {
public static void main(String[] args) throws Exception {
//1.获得解析器工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//2.获得解析器对象
DocumentBuilder builder =factory.newDocumentBuilder();
//3.解析xml文件
Document doc=builder.parse("src/info.xml");
//根据标签内容获得所有的元素节点信息
NodeList brandNodeList=doc.getElementsByTagName("Brand");
//循环遍历
for (int i = 0; i < brandNodeList.getLength(); i++) {
Node brandNode=brandNodeList.item(i); //获得节点
Element brandEle=(Element) brandNode; //强制类型转换,将节点转换为元素
String brandAttr=brandEle.getAttribute("name"); //获得元素对应的属性值
NodeList type=brandEle.getChildNodes();
for (int j = 0; j < type.getLength(); j++) {
Node typeNode=type.item(j);
if(typeNode.getNodeType()==Element.ELEMENT_NODE) {
Element typeEle=(Element)typeNode;
String typeName=typeEle.getAttribute("name");
System.out.println("品牌:"+brandAttr+",型号:"+typeName);
}
}
}
}
}
//注意:Document对象代表整个xml文档,所有的节点都是以一定的顺序包含在Document对象以内。
Document对象的主要方法:
- getElementsByTagName(String name):返回的是一个NodeList对象,包含所有的标签名称。
- getDocumentElement():返回的是这个Dom树的根节点的Element对象,也就是这个根元素的对象。
NodeList对象:
- getLength():返回列表的长度。
- item(int index):返回指定位置的Node对象
Node对象:
- getChildNodes():包含所有的子节点的集合。
- getFirstChild():如果节点存在子节点,那么返回第一个子节点
- getLastChild():如果节点存在子节点,那么返回最后一个子节点
- getNodeName():返回节点的名称
- getNodeValue():返回节点的值。
- getNodeType():返回节点的类型。
添加新节点代码如下:
public class Test2 {
public static void main(String[] args) throws Exception {
// 1.获得解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.获得解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文件
Document doc = builder.parse("src/info.xml");
//添加子节点
//1.创建Brand节点,也就数创建新元素
Element brandEle=doc.createElement("Brand");
//2.为新创建的元素添加文本和属性
brandEle.setAttribute("name", "oppo手机");
brandEle.setTextContent("充电5分钟,通话1小时!");
//将这个元素添加到dom树中
// Element root=doc.getElementById("ID");
Element oppo=(Element) doc.getElementsByTagName("PhoneInfo").item(0);
//父节点追加子节点
oppo.appendChild(brandEle);
//将内存中dom树保存到XML文件
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
DOMSource domsource=new DOMSource(doc); //关联原本的dom树
transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result=new StreamResult(new FileOutputStream("src/chap06/info.xml"));
//将dom树转换成xml文件
transformer.transform(domsource, result);
}
}
修改节点:
public class Test3 {
public static void main(String[] args) throws Exception {
// 1.获得解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.获得解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文件
Document doc = builder.parse("src/chap06/info.xml");
//修改元素
//先找到要修改的元素
NodeList list=doc.getElementsByTagName("Brand");
for(int i=0;i<list.getLength();i++) {
Node brandNode=list.item(i); //遍历循环,拿到每一个节点元素
Element brandEle=(Element) brandNode;
String brandAttr=brandEle.getAttribute("name");
//判断,如果说获得到的子节点是苹果,那么就修改
if(brandAttr.equals("苹果")) {
//修改:将找到的元素节点修改成apple
brandEle.setAttribute("name","apple");
}
}
//将内存中dom树保存到XML文件
//解析器工厂
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();//解析器对象
DOMSource domsource=new DOMSource(doc); //内存中原来的dom树
transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");//设置编码格式
transformer.setOutputProperty(OutputKeys.INDENT, "yes");//设置在输出内容的时候格式化
StreamResult result=new StreamResult(new
FileOutputStream("src/chap06/info.xml"));//保存该文档
//将dom树转换成xml文件
transformer.transform(domsource, result);
}
}
删除节点:
//删除元素
//先找到要删除的元素
NodeList list=doc.getElementsByTagName("Brand");
for(int i=0;i<list.getLength();i++) {
Node brandNode=list.item(i); //遍历循环,拿到每一个节点元素
Element brandEle=(Element) brandNode;
String brandAttr=brandEle.getAttribute("name");//拿到属性值的名字
//判断,如果说获得到的子节点是apple,那么就去删除
if(brandAttr.equals("apple")) {
//删除:通过父节点去删除自己,也就是子节点
brandEle.getParentNode().removeChild(brandNode);
}
}