java中的xml解析---------DOM解析

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);
			}
		}

猜你喜欢

转载自blog.csdn.net/JAVA52Lin/article/details/83624334