XML之写入文件

通过代码实例对DOM SAX JDOM DOM4J四种写入文件的方法进行介绍

写在前面:

1、DOM4J方法效率相对较高,需掌握好

2、DOM写入基于树,会在内存中先建好一棵树,之前再向xml文件输出。因此相对好修好树的结构

3、SAX写入基于事件,比较偏向于适合较少修改结构。大量频繁修改则不适合适用

3、JDOM DOM4J基于底层API,需自己向项目中导入jar包,这两种方法相比于前面两种,较为简单

4、rss文件(简易信息聚合,也叫聚合内容)是一种RSS基于XML标准,在互联网上被广泛采用的内容包装和投递协议。RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用

5、JDOM和DOM4J两种方法则提供了生成rss文件的方法


另:不同方法需要导入不同的包,在添加时应注意。下面四种方法没有相关import的语句,读者自行加油

DOM

public static void testWrite() {

		// 创建一个DocumentBuilderFactory对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 创建一个DocumentBuilder的对象
		DocumentBuilder db = null;
		try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		Document document = db.newDocument();
		/*
		 * Standalone 定义了外部定义的 DTD 文件的存在性. standalone element 有效值是 yes 和 no 值 no
		 * 表示这个 XML 文档不是独立的而是依赖于外部所定义的一个 DTD. 值 yes 表示这个 XML
		 * 文档是自包含的(self-contained).
		 */
		document.setXmlStandalone(true);
		// 创造节点
		Element bookstore = document.createElement("bookstore");
		Element book = document.createElement("book");
		Element name = document.createElement("name");
		//添加尖括号中间的值 aa <>aa</>
		name.setTextContent("数据结构");
		// 创造关系,从叶往根倒着来
		// 向book添加name节点
		book.appendChild(name);
		// 添加book的属性
		book.setAttribute("id", "001");
		// 向bookstore根节点中添加子节点book
		bookstore.appendChild(book);
		//将bookstore节点添加到dom树中
		document.appendChild(bookstore);
		// 以上创建了dom树 下面开始将创建的dom树向xml文件写入

		// 创建TransformerFactory对象
		TransformerFactory tff = TransformerFactory.newInstance();
		try {
			// 创建 Transform对象
			Transformer tf = (Transformer) tff.newTransformer();
			// 设置xml文件换行
			tf.setOutputProperty(OutputKeys.INDENT, "yes");
			tf.transform(new DOMSource(document), new StreamResult(new File("newbookDOM.xml")));
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

SAX

public class Book {

	private String id;
	private String name;
	private String author;
	private String year;
	private String language;
	private String price;
	
	

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String language) {
		this.language = language;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}

}

public static void testWrite() {
		// 生成两本书,并存入bookList中
		Book b1 = new Book();
		b1.setId("1");
		b1.setName("冰与火之歌");
		b1.setAuthor("乔治马丁");
		b1.setYear("2014");
		b1.setPrice("89");
		Book b2 = new Book();
		b2.setId("2");
		b2.setName("安徒生童话");
		b2.setAuthor("乔治马丁");
		b2.setYear("2004");
		b2.setPrice("77");
		b2.setLanguage("English");
		ArrayList<Book> bookList = new ArrayList<Book>();
		bookList.add(b1);
		bookList.add(b2);

		// 生成xml文件
		// 1、创建SAXTransformerFactory对象
		SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
		try {
			// 2、通过 SAXTransformerFactory对象创建一个 TransformerHandler对象
			TransformerHandler handler = tff.newTransformerHandler();
			// 3、通过TransformerHandler对象创建一个Transformer对象
			Transformer tf = handler.getTransformer();
			// 4、通过对Transformer对象对生成的xml文件进行设置
			tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			tf.setOutputProperty(OutputKeys.INDENT, "yes");
			// 5、创建一个Result对象
			File file = new File("newbookASX.xml");
			if (!file.exists()) {
				file.createNewFile();
			}
			// 6、创建Result对象,并且使其与handler关联
			Result result = new StreamResult(new FileOutputStream(file));
			handler.setResult(result);
			// 7、利用handler对象进行xml文件的编写
			// 打开document
			handler.startDocument();
			AttributesImpl attr = new AttributesImpl();
			handler.startElement("", "", "bookstore", attr);
			for (Book book : bookList) {
				attr.clear();
				attr.addAttribute("", "", "id", "", book.getId());
				handler.startElement("", "", "book", attr);
				//创建name节点
				if(book.getName() != null && book.getName().trim().equals("")){
					attr.clear();
					handler.startElement("", "", "name", attr);
					handler.characters(book.getName().toCharArray(), 0, book.getName().length());
					handler.endElement("", "", "name");
				}
				// 创建year节点
				if (book.getYear() != null && !book.getYear().trim().equals("")) {
					attr.clear();
					handler.startElement("", "", "year", attr);
					handler.characters(book.getYear().toCharArray(), 0, book
							.getYear().length());
					handler.endElement("", "", "year");
				}
				// 创建author节点
				if (book.getAuthor() != null && !book.getAuthor().trim().equals("")) {
					attr.clear();
					handler.startElement("", "", "author", attr);
					handler.characters(book.getAuthor().toCharArray(), 0, book
							.getAuthor().length());
					handler.endElement("", "", "author");
				}
				// 创建price节点
				if (book.getPrice() != null && !book.getPrice().trim().equals("")) {
					attr.clear();
					handler.startElement("", "", "price", attr);
					handler.characters(book.getPrice().toCharArray(), 0, book
							.getPrice().length());
					handler.endElement("", "", "price");
				}
				// 创建language节点
				if (book.getLanguage() != null && !book.getLanguage().trim().equals("")) {
					attr.clear();
					handler.startElement("", "", "language", attr);
					handler.characters(book.getLanguage().toCharArray(), 0, book
							.getLanguage().length());
					handler.endElement("", "", "language");
				}
				handler.endElement("", "", "book");
			}
			handler.endElement("", "", "bookstore");
			//关闭document
			handler.endDocument();
			
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

JDOM

public static void testWrite() {
		// 1、生成一个根节点
		Element rss = new Element("rss");
		// 2、为节点添加属性
		rss.setAttribute("version", "2.0");
		// 3、生成一个document对象
		Document document = new Document(rss);

		Element channel = new Element("channel");
		rss.addContent(channel);
		Element title = new Element("tittle");
		//特殊字符不转义
		CDATA cdata = new CDATA("<!上海移动互联网产业促进中心正式揭牌 >");
		title.addContent(cdata);
		//title.setText("<![CDATA[上海移动互联网产业促进中心正式揭牌 ]]>");
		channel.addContent(title);

		Format format = Format.getPrettyFormat();
		format.setEncoding("GBK");

		// 4、创建XMLOutputter对象
		XMLOutputter outputter = new XMLOutputter(format);
		try {
			// 5、利用outputter将document对象转化成xml文档
			outputter.output(document, new FileOutputStream(new File("JDOMnews.xml")));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

DOM4J

public static void testWrite(){
		//1、创建document对象,代表整个xml文档
		Document document = DocumentHelper.createDocument();
		//2、创建根节点rss
		Element rss = document.addElement("rss");
		//3、向根节点rss中添加version属性
		rss.addAttribute("version", "2.0");
		//4、生成子节点及节点内容
		Element channel = rss.addElement("channel");
		Element tittle = channel.addElement("title");
		tittle.setText("国际好新闻");
		Element content = tittle.addElement("content");
		//setText将文本里的文件,全部清除,设置为当前的,而addText是添加内容,
		content.setText("<![CDATA[上海移动互联网产业促进中心正式揭牌 ]]>");
		content.addText("<![CDATA[上海移动互联网产业促进中心正式揭牌 ]]>");
		//5、设置生成xml文件
		OutputFormat format = OutputFormat.createPrettyPrint();
		//设置编码格式
		format.setEncoding("GBK");
		//6、生成xml文件
		try {
			XMLWriter writer = new XMLWriter(new FileOutputStream(new File("news.xml")), format);
			//设置是否转义 默认值true 代表转义
			writer.setEscapeText(false);
			writer.write(document);
			writer.close();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

猜你喜欢

转载自blog.csdn.net/nut___/article/details/79828353