使用DOM生成XML的文件属性名和属性值、节点名和节点值

在前一篇文章  使用DOM解析XML的文件属性名和属性值、节点名和节点值  的基础之上,在该CLASS类中写一个CreateXML方法用于生成XML文件,生成XML的主要步骤如下:

1、创建DocumentBuilderFactory对象

2、根据DocumentBuilderFactory对象创建DocumentBuilder对象

3、根据DocumentBuilder对象的newDocument()方法生成Ducoment对象

前2个步骤和解析XML的方法readXML()相同,可以提取出一个函数用于调用,该函数getDocumentBuilder()用于获取DocumentBuilder对象,并加入createXML()方法后,代码如下:

package com.imooc.io;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
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.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Xmltest {
	public static void main(String[] args){
		Xmltest t = new Xmltest();
		t.createXML();
	}
	
	/**
	 * 获取DocumentBuilder对象
	 */
	public DocumentBuilder getDocumentBuilder(){
		//创建DocumentBuilderFactory对象
		DocumentBuilderFactory a = DocumentBuilderFactory.newInstance();
		//创建DocumentBuilder对象
		DocumentBuilder b = null;
		try {
			b = a.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return b;
	}
	
	
	/**
	 * 创建XML文件
	 */
	public void createXML(){
		DocumentBuilder b = getDocumentBuilder();
		Document document = b.newDocument();
		/**
		 * document.setXmlStandalone(true)是设置XML文件头部的standalone="no"
		 * standalone : 用来表示该文件是否呼叫其它外部的文件
		 * 若值是 ”yes” 表示没有呼叫外部文件,即说明当前的xml文件是没有DTD和Schema作为它的相关文档.
		 * 若值是 ”no” 则表示有呼叫外部文件。默认值是 “yes”。
		 * DTD:文档类型定义(Document Type Definition)是一套关于标记符的语法规则。
		 */
		document.setXmlStandalone(true);
		//创建节点
		Element bookstore = document.createElement("bookstroe");
		Element book = document.createElement("book");
		Element name = document.createElement("name");
		Element athor = document.createElement("athor");
		Element year = document.createElement("year");
		Element price = document.createElement("price");
	    //把文本内容添加到子节点
		name.setTextContent("后会无期");
		athor.setTextContent("abc");
		year.setTextContent("2010");
		price.setTextContent("40");
		//把子节点作为book下面的子节点
		book.appendChild(name);
		book.appendChild(athor);
		book.appendChild(year);
		book.appendChild(price);
		
		//给book节点添加属性和属性值
		book.setAttribute("id", "1");
		//将book节点添加到bookstore节点中
		bookstore.appendChild(book);
		//将bookstore(包含book节点)添加到dom树中
		document.appendChild(bookstore);
		//创建TransformerFactory对象
		TransformerFactory tf = TransformerFactory.newInstance();
		try {
			//创建Transformer
			Transformer tff = tf.newTransformer();
			//设置xml格式,是否换行
			tff.setOutputProperty(OutputKeys.INDENT,"yes");
			//transform()方法第一个参数是数据来源,第二个是一个目标文件
			tff.transform(new DOMSource(document), new StreamResult(new File("book.xml")));
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			}
	}
	
	
	
	/**
	 * 读取XML文件
	 */
	public void readXML(){
		       
				try {
					DocumentBuilder b = getDocumentBuilder();
					//通过DocumentBuilder对象的parse方法返回一个Document对象
					Document document = b.parse("demo.xml");
					//通过Document对象的getElementsByTagName()返根节点的一个list集合
					NodeList booklist = document.getElementsByTagName("book");
					for(int i =0; i<booklist.getLength(); i++){
						//循环遍历获取每一个book
						Node book = booklist.item(i);
						//通过Node对象的getAttributes()方法获取全的属性值
						NamedNodeMap bookmap = book.getAttributes();
						//循环遍每一个book的属性值
					    for(int j = 0; j<bookmap.getLength(); j++){
					    	Node node = bookmap.item(j);
					    	//通过Node对象的getNodeName()和getNodeValue()方法获取属性名和属性值
					    	System.out.println(node.getNodeName());
					    	System.out.println(node.getNodeValue());
					    }
					    NodeList childlist = book.getChildNodes();
					    for(int t = 0; t<childlist.getLength(); t++){
					    	//区分出text类型的node以及element类型的node
					    	if(childlist.item(t).getNodeType() == Node.ELEMENT_NODE){
					    		System.out.println(childlist.item(t).getNodeName());
					    		//如果子节点里面还嵌套着子节点,如:<name><a>www</a>放学后</name>
					    		//getTextContent()方法能够一起输出:www放学后
					    		System.out.println(childlist.item(t).getTextContent());
					    		//getFirstChild()的getNodeValue(),如果子节点里面嵌套这子节点
					    		//如:<name><a>www</a>放学后</name>,则会输出null
					    		//System.out.println(childlist.item(t).getFirstChild().getNodeValue());
					    	}
					    }
					}
				} catch (SAXException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
	}

}

运行后刷新项目,并看到book.xml文件,成功生成XML文件并打开代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstroe>
<book id="1">
<name>后会无期</name>
<athor>abc</athor>
<year>2010</year>
<price>40</price>
</book>
</bookstroe>


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值