JAVA生成XML
2016-06-02 15:08
375 查看
DOM方式:
SAX方式:
使用SAX解析时创建的SAXParserHandler.java
DOM4J方式:
RSS就是一个特殊格式的XML
JDOM方式:
生成方式对比
DOM 基于树结构,始终在内存中,方便增删改操作
SAX基于事件
JDOM 基于底层API
DOM4J基于底层API
package DomTest; 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 DOMTest { /*** * 生成XML */ public void creatXML(){ DocumentBuilder db=getDocumentBuilder(); Document document=db.newDocument(); document.setXmlStandalone(true);//设置XML的standalone属性 //创建根节点 Element bookstore= document.createElement("bookStore"); //添加子节点book Element book=document.createElement("book"); //添加子节点name Element name=document.createElement("name"); book.appendChild(name); //添加子节点内容 name.setTextContent("人猿泰山"); book.setAttribute("id", "1"); //将book子节点添加到bookstore中 bookstore.appendChild(book); //将bookstore节点(已包含book)添加到dom数中 document.appendChild(bookstore); // TransformerFactory tff=TransformerFactory.newInstance(); try { Transformer tf=tff.newTransformer(); //让DOM树输出过程中正常换行 tf.setOutputProperty(OutputKeys.INDENT, "yes"); tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml"))); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static DocumentBuilder getDocumentBuilder(){ // 创建一个DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 创建DocumentBuilder对象 DocumentBuilder db=null; try { db = dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return db; } public static void main(String[] args) { // 创建一个DocumentBuilder的对象 try { // 通过DocumentBuilder对象的parse方法加载books.xml文件 // 到当前项目下 Document document = getDocumentBuilder().parse("books.xml"); // 获取所有book节点的集合 NodeList bookList = document.getElementsByTagName("book"); //通过nodeList的getLength()方法获取bookLIst的长度 System.out.println("一共有:"+bookList.getLength()+"本书"); //便利各个book节点 for (int i = 0; i < bookList.getLength(); i++) { System.out.println("++++++++++++开始遍历第"+(i+1)+"本书+++++++++++"); //方式一,不知道有多少节点,通过循环来遍历所有节点。 //通过 item(i)获取一个book节点,nodeList Node book=bookList.item(i); //获取book的属性的集合 NamedNodeMap attrs=book.getAttributes(); System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性"); //便利book的属性 for (int j = 0; j < attrs.getLength(); j++) { //通过item()方法获取book节点的某一个属性 Node attr=attrs.item(j); //获取属性名 System.out.println("属性名:"+attr.getNodeName()); //获取属性值 System.out.println("属性值:"+attr.getNodeValue()); } // //方式二,知道有且只有一个节点。并且知道属性的名称为“id” // //强制类型转换将book节点类型转换为Element类型 // Element book =(Element) bookList.item(i); // // //通过getAttribute(“id”)方法获取到属性的值 // String attrValue=book.getAttribute("id"); // System.out.println("id的属性的属性值为"+attrValue); //解析book节点的子节点,需要用到方式一中创建的book对象 //获取子节点的集合 NodeList childNodes=book.getChildNodes(); //遍历childNodes获取每个子节点的节点名和节点值 System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点"); //循环遍历 for (int j = 0; j < childNodes.getLength(); j++) { //区分text类型的node和element类型的node if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){ //输出了element类型节点的节点名 System.out.println("第"+(j+1)+"个节点名:"+childNodes.item(j).getNodeName()); //输出element类型节点的节点值 //需先获取当前节点的首个子节点,否则获取的是《name》标签的值NULL //方式一:如果<name>节点下有多个子节点,此方法只输出确定的某个子节点的值 //同样要注意,<name>节点的第一个子节点的值是第一子节点的类型的值,还是NULL System.out.println("节点值为:"+childNodes.item(j).getFirstChild() .getNodeValue()); //方式二:如果<name>节点下有多个子节点,此方法输出所有子节点的text System.out.println(childNodes.item(j).getTextContent()); } } System.out.println("++++++++++++结束遍历第"+(i+1)+"本书++++++++++++"); } } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } DOMTest test=new DOMTest(); test.creatXML(); } }
SAX方式:
使用SAX解析时创建的SAXParserHandler.java
package test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import test2.SAXParserHandler; import test3.Book; public class SAXTest { public ArrayList<Book> parseXML(){ // 通过SAXParseFactory的静态newInstance() //方法获取SAXParseFactory实例factory SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParserHandler handler=null; //通过SAXParserFactory实例的newSAXParser() //方法返回SAXParse实例parser try { SAXParser parser= factory.newSAXParser(); //创建SAXParserHandler对象 handler=new SAXParserHandler(); parser.parse("books.xml", handler); System.out.println("书的数量:"+handler.getBookList().size()); for(Book book: handler.getBookList()){ System.out.println(book.getId()); System.out.println(book.getName()); System.out.println(book.getAuthor()); System.out.println(book.getPrice()); System.out.println(book.getYear()); System.out.println("-------------"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException | SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } return handler.getBookList(); } public void createXML(){ ArrayList<Book> bookList=parseXML(); //生成XML //1、创建一个TransformFacroty对象 SAXTransformerFactory tff=(SAXTransformerFactory) SAXTransformerFactory.newInstance(); try { //2、通过SAXTransformerFactory对象创建一个TransformerHandler对象 TransformerHandler handler=tff.newTransformerHandler(); //3、通过handler对象创建一个Transformer对象 Transformer tr=handler.getTransformer(); //4、通过Transformer对象对生成的XML文件进行设置 //设置XML编码 tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //设置换行 tr.setOutputProperty(OutputKeys.INDENT, "yes"); //5、创建一个Result对象 File f=new File("src/newbooks.xml"); if(!f.exists()){ f.createNewFile(); } Result result=new StreamResult(new FileOutputStream(f)); //6、创建result对象并使其与handler关联 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); attr.clear(); //创建name节点 handler.startElement("", "", "name", attr); handler.characters(book.getName().toCharArray(), 0, book.getName().length()); handler.endElement("", "", "name"); //创建author节点 attr.clear(); handler.startElement("", "", "author", attr); handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length()); handler.endElement("", "", "author"); //创建price节点 attr.clear(); handler.startElement("", "", "price", attr); handler.characters(book.getPrice().toCharArray(), 0, book.getPrice().length()); handler.endElement("", "", "price"); //创建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"); } handler.endElement("", "", "book"); } //结束标签 handler.endElement("", "", "bookstore"); //关闭document handler.endDocument(); } catch (TransformerConfigurationException | IOException | SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { SAXTest test=new SAXTest(); test.createXML(); } }
DOM4J方式:
RSS就是一个特殊格式的XML
package Dom4jTest; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class DOM4JTest { public static void main(String[] args) { new DOM4JTest().createXML(); } public void parseXML() { // TODO Auto-generated method stub // 创建SAXReader对象 SAXReader reader = new SAXReader(); // 通过reader对象read 方法加载book.xml try { Document document = reader.read(new File("src/res/books.xml")); // 通过document对象获取根节点bookstore Element bookStore = document.getRootElement(); // 通过element对象的elementIterator方法获取迭代器 Iterator it = bookStore.elementIterator(); // 遍历迭代器,获取根节点中的信息 while (it.hasNext()) { System.out.println("开始遍历一本书"); Element book = (Element) it.next(); // 获取book的属性名和属性值 List<Attribute> bookAttrs = book.attributes(); for (Attribute attr : bookAttrs) { System.out.println("属性名:" + attr.getName() + "\t属性值:" + attr.getValue()); } Iterator itt = book.elementIterator(); while (itt.hasNext()) { Element bookChild = (Element) itt.next(); System.out.println("节点名:" + bookChild.getName() + "\t节点值:" + bookChild.getStringValue()); } System.out.println("结束遍历一本书" + "\n"); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void createXML(){ //1、创建Document对象,代表整个XML Document document=DocumentHelper.createDocument(); //2、创建根节点 Element rss=document.addElement("rss"); //3、向rss节点中添加version属性 rss.addAttribute("version", "2.0"); //4、生成子节点及内容 Element channel=rss.addElement("channel"); Element title=channel.addElement("title"); title.setText("新闻资讯"); //设置换行 OutputFormat format=OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); //5、生成XML文件 File file=new File("rssnews.xml"); XMLWriter writer; try { writer = new XMLWriter(new FileOutputStream(file),format); //设置是否转义,默认是true进行转义 writer.setEscapeText(false); writer.write(document); writer.close(); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
JDOM方式:
package test; import java.util.ArrayList; import java.util.List; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; import test3.Book; public class JDOMTest { private static ArrayList<Book> booksList = new ArrayList<Book>(); public static void main(String[] args) { new JDOMTest().createXML(); } public void parserXML() { // JDOM解析XML文件 // 创建一个SAXBuilder对象 SAXBuilder saxbuilder = new SAXBuilder(); InputStream in; try { // 创建一个输入流,将xml文件加载到流中 in = new FileInputStream("src/res/books.xml"); // InputStreamReader ins=new InputStreamReader(in,"UTF-8"); // 通过saxbuilder的build方法将输入流加载到saxbuilder中 Document document = saxbuilder.build(in); // 通过document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 获取根节点下的子节点的集合 List<Element> bookList = rootElement.getChildren(); // 使用foreach循环解析 for (Element book : bookList) { Book bookEntity = new Book(); System.out.println("开始解析第" + (bookList.indexOf(book) + 1) + "本书============"); // 解析book的属性 List<Attribute> attrList = book.getAttributes(); // //知道节点属性名 // book.getAttribute("id"); // 针对不清楚book节点下属性名和数量的情况 // 遍历attrList for (Attribute attr : attrList) { // 获取属性名和属性值 String attrName = attr.getName(); String attrValue = attr.getValue(); System.out.println("属性名:" + attrName + "\t属性值:" + attrValue); // 存储book节点 if (attrName.equals("id")) { bookEntity.setId(attrValue); } } // 对book节点的子节点的节点名和节点值进行遍历 List<Element> bookChilds = book.getChildren(); for (Element child : bookChilds) { System.out.println("节点名:" + child.getName() + "\t节点值:" + child.getValue()); // 存储子节点名 if (child.getName().equals("name")) { bookEntity.setName(child.getValue()); } else if (child.getName().equals("author")) { bookEntity.setAuthor(child.getValue()); } else if (child.getName().equals("year")) { bookEntity.setYear(child.getValue()); } else if (child.getName().equals("price")) { bookEntity.setPrice(child.getValue()); } } System.out.println("结束解析第" + (bookList.indexOf(book) + 1) + "本书============"); // 添加booksList集合对象 booksList.add(bookEntity); bookEntity = null; System.out.println(booksList.size()); System.out.println(booksList.get(0).getId()); System.out.println(booksList.get(0).getName()); } } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (JDOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void createXML(){ //1、生成一个根节点 Element rss=new Element("rss"); rss.setAttribute("version","2.0");//添加节点属性 //2、生成一个document对象 Document document=new Document(rss); Element channel=new Element("channel"); rss.addContent(channel); Element title=new Element("title"); title.setText("ceshiceshi测试"); channel.addContent(title); Format format=Format.getCompactFormat(); format.setIndent(""); format.setEncoding("GBK"); //创建XMLOutputter对象 XMLOutputter outputer=new XMLOutputter(format); try { outputer.output(document, new FileOutputStream(new File("rssnews"))); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
生成方式对比
DOM 基于树结构,始终在内存中,方便增删改操作
SAX基于事件
JDOM 基于底层API
DOM4J基于底层API
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树