天天看点

Jaxp对xml解析(二)

Javax.xml.transform包中的Transformer类用于把代表Xml文件的Document对象转换成某种格式进行输出,例如把xml文件应用转换成HTML,利用这个对象,当然也可以把Document重新写出一个xml文件中去。

Transformer类通过transfor方法完成转换操作,该方法接受一个源和一个目的地:

Javax.xml.transform.DOMSource类关联要转换的document,

Javax.xml.transform.streamResult类对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得

举例4:    删除<售价>18</售价>  节点

文件book.xml
<?xml version="1.0" encoding="UTF-8"?>
<图书>
      <书>
           <书名>西游记</书名>
	  <作者>吴承恩</作者>
	  <售价>18</售价>  
	  <售价>19</售价>  
      </书>
      <书>
           <书名>三国演义</书名>
            <作者>罗贯中</作者>  
	    <售价>20</售价>
     </书> 
</图书>
           

  方法一: 

@Test
	//删除节点
	public void delete1() throws Exception {
		// 得到工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/com/it/book.xml");

		//得到删除的节点
		Element reNode = (Element) document.getElementsByTagName("售价").item(0);
		//得到删除节点的父亲节点
		Element book = (Element) document.getElementsByTagName("书").item(0);
		//删除父亲节点下的孩子节点
		book.removeChild(reNode);
		// 把更新后内存重新写到XML文档中去
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/com/it/book.xml")));
	}
           

   方法二:

@Test
	//删除节点
	public void delete2() throws Exception {
		// 得到工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/com/it/book.xml");

		//得到删除的节点
		Element reNode = (Element) document.getElementsByTagName("售价").item(0);
		//删除父亲节点下的孩子节点
		reNode.getParentNode().removeChild(reNode);
		
		// 把更新后内存重新写到XML文档中去
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/com/it/book.xml")));
	}   
           
运行结果:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><图书>
      <书>
      <书名 name="dddd">西游记</书名>
	  <作者>吴承恩</作者>
	    
	  <售价>19</售价>  
      </书>
      <书>
      <书名>三国演义</书名>
      <作者>罗贯中</作者>  
	  <售价>20</售价>
     </书> 
</图书>
           

    举例5:删除第一本书全部节点

@Test
	//删除节点
	public void delete3() throws Exception {
		// 得到工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/com/it/book.xml");

		//得到删除的节点
		Element reNode = (Element) document.getElementsByTagName("售价").item(0);
		//删除爷爷节点下的父亲节点
		reNode.getParentNode().getParentNode().removeChild(reNode.getParentNode());
		
		// 把更新后内存重新写到XML文档中去
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/com/it/book.xml")));
	}  
           
运行结果:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><图书>
      
      <书>
      <书名>三国演义</书名>
      <作者>罗贯中</作者>  
	  <售价>20</售价>
     </书> 
</图书>
           

   举例6:删除全部节点

@Test
	public void delete4() throws Exception {
		// 得到工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/com/it/book.xml");

		//得到删除的节点
		Element reNode = (Element) document.getElementsByTagName("售价").item(0);
reNode.getParentNode().getParentNode().getParentNode().removeChild(reNode.getParentNode().getParentNode());
		
		// 把更新后内存重新写到XML文档中去
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/com/it/book.xml")));
	}
           
运行结果:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
           

   举例7:更新节点<售价>18</售价> 的值 

@Test
    public void update() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/com/it/book.xml");

		//得到节点
		Element reNode = (Element) document.getElementsByTagName("售价").item(0);
		//更新节点上的值 
		reNode.setTextContent("21");
		// 把更新后内存重新写到XML文档中去
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/com/it/book.xml")));
    }
           
运行结果:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><图书>
      <书>
      <书名>西游记</书名>
	  <作者>吴承恩</作者>
	  <售价>21</售价>   
      </书>
      <书>
      <书名>三国演义</书名>
      <作者>罗贯中</作者>  
	  <售价>20</售价>
     </书> 
</图书>