java2 day03 XML DOM4J

XML文档结构分析


获取Document文档对象

DOM(DocumentObject Model):文档对象模型.把XML文件中的不同结构抽象成一个个对象.

                             或者说,使用面向对象的方式来解析XML.

------------------------------------------------------------------------------------------

     要操作XML,先就得有Document对象:

     把一个XML文件加载进内存的时候,在内存中形成所谓的一种树状结构,我们把这一个结构称之为Document对象.

     注意:

       我们在Java代码中所做的增/删/改/查操作,都仅仅是操作的是内存中的Document对象,和磁盘中的XML文件没有关系.

       比如:删除一个联系人信息之后,XML文件中数据依然存在,此时出现内存中的数据和磁盘文件中的数据不同步,所以,对于增删改操作,我们需要做同步操作(把内存中的数据和磁盘的XML文件数据保持一致).

        DOM:在第一次的时候就会把XML文件加载进内存,如果XML文件过大,可能会造成内存的溢出.

        DOM:在做增删改查操作的时候比较简单,但是性能却不高(线性搜索).

获取Document文档对象:

      1):表示出需要被操作的XML文件的路径,注意是文件的路径,不是文件所在的目录.

         File f = newFile("D:/JavaApps/dom-dom4j/contacts.xml");

      2):根据DocumentBuilderFactory类,来获取DocumentBuilderFactory对象.

             注意:工厂设计模式往往体现着单例设计模式.

         DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

      3):根据DocumentBuilderFactory对象,构建DocumentBuilder对象.

             注意:XxxFactory,就是用来创建Xxx对象的.

         DocumentBuilder builder =factory.newDocumentBuilder();

      4):根据DocumentBuidler对象,构建Document对象.

         Document doc = builder.parse(f);

DOM操作练习

需求1、得到某个具体的文本节点的内容:取出第二个联系人的名字.

操作步骤:

     ①:获取Document文档对象.

     ②:获取XML的根元素对象:contacts.

     ③:获取根元素下的第二个linkman元素.

     ④:获取该linkman元素下的第一个name元素.

     ⑤:获取该name元素的文本内容.

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


public class FindXml {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		File f = new File("F:/java/javaApp/XML/cc.xml");
		DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document root = builder.parse(f);
		
		NodeList nodelist = root.getElementsByTagName("linkman");
		Element item = (Element) nodelist.item(1);
		
		Element nameEl = (Element) item.getElementsByTagName("name").item(0);
		
		String name = nameEl.getTextContent();
		System.out.println(name);
		
		
	}

}

修改xml并且保存到文件

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class DoucmentRevise {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void main(String[] args) throws SAXException, IOException, Exception {
		File f = new File("info.xml");
		Document root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
		Element nameEl = (Element) root.getElementsByTagName("linkman").item(1);
		Element nameEL = (Element) nameEl.getElementsByTagName("name").item(0);
		nameEL.setTextContent("xiaoyi");
		
		Transformer trans = TransformerFactory.newInstance().newTransformer();
		
		
		Source xmlSource = new DOMSource(root);
		Result outputTarget = new StreamResult(f);
		trans.transform(xmlSource, outputTarget);
		
	}

}
向指定元素节点中增加子元素节点:增加一个联系人信息

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class DocumentAddElements {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void main(String[] args) throws SAXException, IOException, Exception {
		File f = new File("info.xml");
		Document root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
		Element doc = root.getDocumentElement();
		Element linkmanEl = root.createElement("linkman");
		Element nameEl = root.createElement("name");
		Element ageEl = root.createElement("age");
		
		nameEl.setTextContent("吴彦祖");
		ageEl.setTextContent("34");
		
		linkmanEl.appendChild(nameEl);
		linkmanEl.appendChild(ageEl);
		
		doc.appendChild(linkmanEl);
		
		Transformer trans = TransformerFactory.newInstance().newTransformer();
		trans.transform(new DOMSource(root), new StreamResult(f));
		
		
	}

}
设置元素的属性和得到元素的属性
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class DocumentSetAtt {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void main(String[] args) throws SAXException, IOException, Exception {
		File f = new File("info.xml");
		Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
		Element linmanEl = (Element) doc.getElementsByTagName("linkman").item(0);
		String id = linmanEl.getAttribute("id");
		System.out.println(id);
		
		//设置吴彦祖id为3
		Element wuEl = (Element) doc.getElementsByTagName("linkman").item(2);
		wuEl.setAttribute("id", "3");
		
		//同步操作
		Transformer trans = TransformerFactory.newInstance().newTransformer();
		
		Source xmlSource = new DOMSource(doc);
		Result outputTarget = new StreamResult(f);
		trans.transform(xmlSource, outputTarget);
		
		
	}

}

删除子结点元素

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class DocumentDel {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void main(String[] args) throws SAXException, IOException, Exception {
		Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("info.xml"));
		Element root = doc.getDocumentElement();
		
		Element linkmanEl = (Element) doc.getElementsByTagName("linkman").item(2);
		linkmanEl.getParentNode().removeChild(linkmanEl);
		
		Transformer trans = TransformerFactory.newInstance().newTransformer();
		trans.transform(new DOMSource(doc), new StreamResult(new File("info.xml")));
	}

}

创建新的xml并且设置内容

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;



public class DocumentCreat {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		File f = new File("xx.xml");
		
		//设置文档对象
		Document doc = null;
		//设置节点最高
		Element root = null;
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		if(f.exists()){
			builder.parse(f);
		}else{//如果文件不存在
			doc = builder.newDocument();
			//设置xml版本号
			doc.setXmlVersion("1.0");
			//创建根元素
			root = doc.createElement("contacts");
			//和doc关联,contacts是顶级元素
			doc.appendChild(root);
		}
		
		
		//创建元素
		Element linkmanEl = doc.createElement("linkmaEl");
		Element nameEl = doc.createElement("name");
		Element ageEl = doc.createElement("age");
		//创建的元素添加内容
		nameEl.setTextContent("will");
		ageEl.setTextContent("18");
		
		//加入到父节点
		linkmanEl.appendChild(nameEl);
		linkmanEl.appendChild(ageEl);
		//根节点 添加创建的节点
		root.appendChild(linkmanEl);
		
		//同步操作
		Transformer trans = TransformerFactory.newInstance().newTransformer();
		trans.transform(new DOMSource(doc), new StreamResult(f));
		
		
	}

}
dom4j查询所有信息

package dom4j;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		File f = new File("info.xml");
		SAXReader reader = new SAXReader();
		Document doc = reader.read(f);
		
		Element root = doc.getRootElement();
		List<Element> elements = root.elements("linkman");
		for (Element element : elements) {
			String id = element.attributeValue("id");
			String name = element.elementText("name");
			String age = element.elementText("age");
			
			System.out.println("id="+id+",name="+name+",age="+age);
			
		}
	}

}
dom4j增加一个联系人

package dom4j;

import java.io.File;
import java.io.FileWriter;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jCreat {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		File f = new File("info.xml");
		SAXReader reader = new SAXReader();
		Document doc = reader.read(f);
		Element root = doc.getRootElement();
		
		Element linkmanEl = root.addElement("linkman");
		linkmanEl.addAttribute("id", "5");
		linkmanEl.addElement("name").setText("西门吹雪");
		linkmanEl.addElement("age").setText("33");
		
		//同步操作 快捷保存
		//FileWriter out = new FileWriter(f);
		//doc.write(out);
		//out.close();
		
		
		//同步操作,好看的保存方式
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(new FileWriter(f),format);
		writer.write(doc);
		writer.close();
	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值