通过代码实例对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的语句,读者自行加油
扫描二维码关注公众号,回复:
131425 查看本文章
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(); } }