XML语言学习CRUD3----方立勋JAXP

XML解析方式分为两种:dom和sax

dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

sax:(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

dom文档:将文档装载到document,所有元素都会创建一个对象。只要得到根节点就可以得到一切。

优点:使用dom解析xml文档,实现crud特别方便,操作速度也比较快。 

缺点:使用dom解析xml文档,如果文件比较大,对内存消耗就特别大,极容易导致内存溢出,所以dom方式不适合操作大的xml文档。


JAVA虚拟机默认修改IntelliJ IDEA 7.0\bin下idea.exe.vmoptions   -xmx大小

sax:读到一行解析一行。

特点:

1、解析速度快、对内存占用少,查找数据特别方便

2、只适合查找数据,不适合作增删改操作

dom4j最好的XML解析开发包。但Jaxp是SUN公司的标准。


jaxp对xml文件进行crud:

先产生一个document解析对象。

//1.获取工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		
//2.产生解析器
DocumentBuilder builder = factory.newDocumentBuilder();
		
//3.解析xml文档,得到代表文档的document
Document document = builder.parse(new File("src/book1.xml"));


操作xml文档的元素时,一般都把元素当作node对象,但是程序员如果发现node不好使时,就应把node强转成相应类型


标签的CEUD操作:

查询:

//得到售价结点的值
	@Test
	public void read() throws Exception{
		
		//1.获取工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse(new File("src/book.xml"));
		
		NodeList list = document.getElementsByTagName("售价");
		Node price = list.item(0);
		
		String value = price.getTextContent();
		System.out.println(value);
	}



修改:   transformer

	//修改结点的值:<售价>39.00元</售价>改为109
	@Test
	public  void update() throws Exception{
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder  builder = factory.newDocumentBuilder();
		Document document = builder.parse(new File("src/book1.xml"));
		
		Node price = document.getElementsByTagName("售价").item(0);
		price.setTextContent("109");
		
		
		//把内存中的document写到xml文档
		TransformerFactory tf = TransformerFactory.newInstance();
		//得到转换器
		Transformer ts = tf.newTransformer();
		ts.transform(new DOMSource(document), new StreamResult(new File("src/book1.xml")));
	}



增加:

//向指定节点中增加孩子节点(售价节点)
	@Test
	public void add() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder  builder = factory.newDocumentBuilder();
		Document document = builder.parse(new File("src/book1.xml"));
		
		//创建需要增加的节点
		Node price = document.createElement("售价");
		price.setTextContent("59元");
		
		//得到需要增加的节点的父亲
		Node parent = document.getElementsByTagName("书").item(0);
		
		//把需要增加的节点挂到父结点上
		parent.appendChild(price);
		
		
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer ts = tf.newTransformer();
		ts.transform(new DOMSource(document), new StreamResult(new File("src/book1.xml")));

	}

	//向指定位置上插入售价节点
	@Test
	public void add2() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder  builder = factory.newDocumentBuilder();
		Document document = builder.parse(new File("src/book1.xml"));
		
		Node node = document.createElement("售价");
		node.setTextContent("39元");
		
		Node parent = document.getElementsByTagName("书").item(0);
		parent.insertBefore(node, document.getElementsByTagName("书名").item(0));
		
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer ts = tf.newTransformer();
		ts.transform(new DOMSource(document), new StreamResult(new File("src/book1.xml")));
	}






删除:

//删除xml文档的售价结点
	@Test
	public void delete() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder  builder = factory.newDocumentBuilder();
		Document document = builder.parse(new File("src/book1.xml"));
		
		Node node = document.getElementsByTagName("售价").item(2);
		node.getParentNode().removeChild(node);
		
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer ts = tf.newTransformer();
		ts.transform(new DOMSource(document), new StreamResult(new File("src/book1.xml")));
	}


xml文档属性操作:

	//操作xml文档属性
	@Test
	public void updateAttribute() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder  builder = factory.newDocumentBuilder();
		Document document = builder.parse(new File("src/book1.xml"));
		
		
		//操作xml文档的元素时,一般都把元素当作node对象,但是程序员如果发现node不好使时,就应把node强转成相应类型
		Node node  = document.getElementsByTagName("书").item(0);
		Element book = null;
		if(node.getNodeType()==Node.ELEMENT_NODE){  //在作结点转换之前,最好先判断结点类型
			book  = (Element)node;
		}
		
		book.setAttribute("name", "yyyyyyy");
		book.setAttribute("password", "123");
		book.removeAttribute("password");
		
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer ts = tf.newTransformer();
		ts.transform(new DOMSource(document), new StreamResult(new File("src/book1.xml")));
	}


遍历(递归):

//遍历
	public static void list(Node node){
		
		if(node.getNodeType()==Node.ELEMENT_NODE){
			System.out.println(node.getNodeName());
		}
		
		NodeList list = node.getChildNodes();
		for(int i=0;i<list.getLength();i++){
			Node child = list.item(i);
			list(child);
		}
	}










 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值