一、SAX解析
1、将要解析的xml文件为TestDom.xml
<?xml version="1.0" encoding="utf-8"?> <bookStore> <book id="1" class="tonghua"> <name>安徒生童话</name> <author>安徒生</author> <year>2008</year> </book> <book id="2" class="xiyouji"> <name>西游记</name> <author>罗贯中</author> </book> </bookStore>
2、Book类
package youth.hong.TestDom; public class Book { private String id = ""; private String className = ""; private String name = ""; private String author = ""; private String year = ""; public Book(String id, String name, String author, String year) { super(); this.id = id; this.name = name; this.author = author; this.year = year; } public Book() { } @Override public String toString() { return "Book [id=" + id + ", className=" + className + ", name=" + name + ", author=" + author + ", year=" + year + "]"; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } 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; } }
3、解析xml的主类
package youth.hong.Handler; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import youth.hong.TestDom.Book; public class SAXHandler extends DefaultHandler{ int bookIndex = 0; private List<Book> bookList = new ArrayList<Book>(); private Book book = null; private String value = null; //用来标志解析开始 @Override public void startDocument() throws SAXException { System.out.println("解析开始"); } //用来标志解析结束 @Override public void endDocument() throws SAXException { System.out.println("解析结束"); } //用来遍历元素 //开始标签 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("book")) { bookIndex++; book = new Book(); System.out.println("============================第" + bookIndex + "本书开始了========================="); //已知book下属性元素的名称 //System.out.println(attributes.getValue("id")); for(int i = 0; i < attributes.getLength(); i++) { String name = attributes.getQName(i); if(name.equals("id")) { book.setId(attributes.getValue(i)); }else if(name.equals("class")) { book.setClassName(attributes.getValue(i)); } book.setId(attributes.getValue(i)); //System.out.println(name); System.out.println("第" + bookIndex + "本书的" + attributes.getQName(i) + "是:" + attributes.getValue(i)/*attributes.getValue(Qname)*/); } }else if(!qName.equals("bookStore")) { System.out.print("第" + bookIndex + "本书的" + qName + "是:"); } } //遍历标签内的内容 @Override public void characters(char[] ch, int start, int length) throws SAXException { value = new String(ch,start,length); //如果标签下没有内容,如bookstore与book之间就没有内容,将不打印 if(!value.trim().equals("")) { System.out.println(value); } } //遍历元素的结束标签 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("book")) { bookList.add(book); book = null; System.out.println("============================第" + bookIndex + "本书结束了========================="); } else if(qName.equals("name")) { book.setName(value); } else if(qName.equals("author")) { book.setAuthor(value); } else if(qName.equals("year")) { book.setYear(value); } } public List<Book> getBookList() { return bookList; } }
4、测试类(包括创建xml文件)
package youth.hong.TestDom; import java.io.File; import java.io.FileOutputStream; import java.util.List; 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.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.helpers.AttributesImpl; import youth.hong.Handler.SAXHandler; public class SAXTest { public List<Book> parseXml() { SAXHandler saxhandler = null; SAXParserFactory parserFactory = SAXParserFactory.newInstance(); try { SAXParser saxParser = parserFactory.newSAXParser(); saxhandler = new SAXHandler(); saxParser.parse("src/TestJDom/TestDom.xml", saxhandler); for (Book book : saxhandler.getBookList()) { System.out.println(book); } System.out.println(); } catch (Exception e) { e.printStackTrace(); }; return saxhandler.getBookList(); } /** * 生成xml文件 */ public void createXml() { List<Book> bookList = this.parseXml(); //转化工厂 SAXTransformerFactory tff = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); try { TransformerHandler handler = tff.newTransformerHandler(); //转换器 Transformer tf = handler.getTransformer(); //设置输出编码为UTF-8 tf.setOutputProperty(OutputKeys.ENCODING, "utf-8"); //输出格式缩进 tf.setOutputProperty(OutputKeys.INDENT, "yes"); //要输出的文件 File file = new File("src/TestJDom/newBook.xml"); //如果文件不存在就创建一个 if(!file.exists()) { file.createNewFile(); } Result result = new StreamResult(new FileOutputStream(file)); //必须在result定义完再加入内容才有效 handler.setResult(result); handler.startDocument(); AttributesImpl atts = new AttributesImpl(); handler.startElement("", "", "bookStore", atts); //遍历所有书籍将他们加入到xml中 for(Book book : bookList) { atts.clear(); /** * public void addAttribute(String uri, String localName,命名空间本地名 String qName,元素名 String type,元素类型 String value)值 */ atts.addAttribute("", "", "id", null, book.getId()); atts.addAttribute("", "", "class", null, book.getClassName()); //注意按照SAX模式解析xml文件的顺序去定义标签 handler.startElement("", "", "book", atts); atts.clear(); handler.startElement("", "", "name", atts); char[] ch = book.getName().toCharArray(); handler.characters(ch, 0, ch.length); handler.endElement("", "", "name"); handler.startElement("", "", "author", atts); ch = book.getAuthor().toCharArray(); handler.characters(ch, 0, ch.length); handler.endElement("", "", "author"); handler.startElement("", "", "year", atts); ch = book.getYear().toCharArray(); handler.characters(ch, 0, ch.length); handler.endElement("", "", "year"); handler.endElement("", "", "book"); } handler.endElement("", "", "bookStore"); handler.endDocument(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { SAXTest saxTest = new SAXTest(); //saxTest.createXml(); saxTest.parseXml(); } }
5、生成newBook.xml文件
<?xml version="1.0" encoding="utf-8"?><bookStore> <book id="tonghua" class="tonghua"> <name>安徒生童话</name> <author>安徒生</author> <year>2008</year> </book> <book id="xiyouji" class="xiyouji"> <name>西游记</name> <author>罗贯中</author> <year/> </book> </bookStore>
二、jdom解析
1、解析与创建
package youth.hong.TestJDom; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; 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 youth.hong.TestDom.Book; public class TestJDom { private static List<Book> bookList = new ArrayList<Book>(); public void parseXML() { SAXBuilder saxBuilder = new SAXBuilder(); try { Document document = saxBuilder .build(new InputStreamReader(new FileInputStream("src/TestJDom/TestDom.xml"),"utf-8")); /*Document document2 = saxBuilder .build(new FileReader("src/TestJDom/TestDom.xml"));*///没有字符编码,所以最好使用上面那种 Element element = document.getRootElement(); int i = 0; // elment.getAttributeValue()返回一个list对象 List<Element> bookList = element.getChildren(); // 遍历每个book的属性 for (Element book : bookList) { Book bookEntity = new Book(); i++; System.out.println("======================第" + i + "开始=========================="); // 已知属性名 // System.out.println(book.getAttributeValue("class")); List<Attribute> attrList = book.getAttributes(); for (Attribute attribute : attrList) { System.out.println("属性名称:" + attribute.getName() + "----属性值是:" + attribute.getValue()); if(attribute.getName().equals("id")) { bookEntity.setId(attribute.getValue()); } else if(attribute.getName().equals("class")) { bookEntity.setClassName(attribute.getValue()); } } List<Element> children = book.getChildren(); for (Element element2 : children) { System.out.println("节点名--" + element2.getName() + "--节点值--" + element2.getValue()); if(element2.getName().equals("name")) { bookEntity.setName(element2.getValue()); } else if(element2.getName().equals("author")) { bookEntity.setAuthor(element2.getValue()); } else if(element2.getName().equals("year")) { bookEntity.setYear(element2.getValue()); } } System.out.println("======================第" + i + "结束=========================="); TestJDom.bookList.add(bookEntity); bookEntity = null; } // System.out.println(TestJDom.bookList.size()); } catch (JDOMException | IOException e) { e.printStackTrace(); } } public void createXML() { //创建一个root节点rss Element rss = new Element("rss"); //定义version属性 rss.setAttribute("version","2.0"); //创建document Document document = new Document(rss); Element channel = new Element("channel"); rss.addContent(channel); Element title = new Element("title"); channel.addContent(title); title.setText("<java你好!!!>"); //title.addContent(new CDATA("<!--java你好!!!-->")); Format format = Format.getCompactFormat(); format.setIndent(""); format.setEncoding("gbk"); XMLOutputter outputer = new XMLOutputter(format); try { outputer.output(document, new FileOutputStream("src/TestJDom/JDomnews.xml")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { TestJDom jd = new TestJDom(); jd.parseXML(); jd.createXML(); } }
2、Jdomnews.xml
<?xml version="1.0" encoding="gbk"?> <rss version="2.0"> <channel> <title><java你好!!!></title> </channel> </rss>
三、dom4j解析
1、解析与创建
package youth.hong.TestDom4J; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; 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; import youth.hong.TestDom.Book; public class Dom4JTest { private static List<Book> bookList = new ArrayList<Book>(); //dom4j解析xml文档 public void parseXML() { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File("src/TestJDom/TestDom.xml")); System.out.println(new File("src/TestJDom/TestDom.xml")); Element bookStore = document.getRootElement(); Iterator<Element> it = bookStore.elementIterator(); while(it.hasNext()) { System.out.println("===================某本书开始=================="); Book bookEntity = new Book(); Element book = it.next(); List<Attribute> attrList = book.attributes(); System.out.println("当前结点下节点的个数(包括空白的文本节点)" + book.nodeCount()); for(Attribute attribute : attrList) { System.out.println("属性名:" + attribute.getName() + "属性值:" + attribute.getValue()); if(attribute.getName().equals("id")) { bookEntity.setId(attribute.getValue()); } else if(attribute.getName().equals("class")) { bookEntity.setClassName(attribute.getValue()); } } Iterator<Element> itt = book.elementIterator(); while(itt.hasNext()) { Element childNode = itt.next(); System.out.println("节点名:" + childNode.getName() + "节点值:" + childNode.getStringValue()); if(childNode.getName().equals("name")) { bookEntity.setName(childNode.getStringValue()); } else if(childNode.getName().equals("author")) { bookEntity.setAuthor(childNode.getStringValue()); } else if(childNode.getName().equals("year")) { bookEntity.setYear(childNode.getStringValue()); } } bookList.add(bookEntity); bookEntity = null; System.out.println("===================某本书结束=================="); System.out.println(bookList.size()); } } catch (DocumentException e) { e.printStackTrace(); } } //生成XML文档 public void createXML() { Document document = DocumentHelper.createDocument(); Element rss = document.addElement("rss"); rss.addAttribute("version", "2.0"); Element channel = rss.addElement("channel"); Element title = channel.addElement("title"); title.setText("<!--新闻要点-->"); Element image = channel.addElement("image"); Element imageTitle = image.addElement("title"); imageTitle.setText("news.baidu.com"); Element link = image.addElement("link"); link.setText("http://news.baidu.com"); Element url = image.addElement("url"); url.setText("http://img.baidu.com/img/logo-news.gif"); File file = new File("src/TestJDom/news.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); try { XMLWriter writer = new XMLWriter(new FileOutputStream(file), format); writer.setEscapeText(false); writer.write(document); } catch (UnsupportedEncodingException | FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { Dom4JTest d4j = new Dom4JTest(); d4j.parseXML(); d4j.createXML(); } }
2、创建的news.xml
<?xml version="1.0" encoding="GBK"?> <rss version="2.0"> <channel> <title><!--新闻要点--></title> <image> <title>news.baidu.com</title> <link>http://news.baidu.com</link> <url>http://img.baidu.com/img/logo-news.gif</url> </image> </channel> </rss>
四、dom解析
1、解析与创建
package youth.hong.TestDom; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class TestDom { private static List<Book> bookSuffle = new ArrayList<Book>(); /** * 获取DocumentBuilder对象 */ public DocumentBuilder getDocumentBuilder() { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = null; try { documentBuilder = dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return documentBuilder; } /** * dom方法解析Xml文件 */ public void domParse() { try { Document document = getDocumentBuilder().parse("src/TestJDom/TestDom.xml"); NodeList bookList = document.getElementsByTagName("book"); for(int i = 0; i < bookList.getLength(); i++) { String id = null; String name = null; String author = null; String year = null; //在不知道属性名称的情况下使用 /*Node book = bookList.item(i); NamedNodeMap attrs = book.getAttributes(); for(int j = 0; j < attrs.getLength(); j++) { Node attr = attrs.item(j); System.out.println(attr.getNodeName() + " " + attr.getNodeValue()); }*/ //在知道属性名称的情况下使用 /*Element book = (Element)bookList.item(i); String id = book.getAttribute("id"); String className = book.getAttribute("class"); System.out.println(id + " " + className); */ Node book = bookList.item(i); Element bookElement = (Element)book; id = bookElement.getAttribute("id"); NodeList childNodes = book.getChildNodes(); System.out.println(childNodes.getLength()); for(int k = 0; k < childNodes.getLength(); k++) { Node childNode = childNodes.item(k); if(childNode.getNodeType() == Node.ELEMENT_NODE) { String value = childNode.getTextContent(); String nodeName = childNode.getNodeName(); switch(nodeName) { case "name" : name = value; value = null; break; case "author" : author = value; value = null; break; case "year" : year = value; value = null; break; } //System.out.println(childNode.getNodeName() + " " + childNode.getFirstChild().getNodeValue()); } } bookSuffle.add(new Book(id,name,author,year)); //System.out.println(); } for(int i = 0; i < bookSuffle.size(); i++) { System.out.println(bookSuffle.get(i)); } } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 生成Xml文件,要创建多本书可以通过for循环来生成,但内容应当定义一个book的类去存储内容 * @param args */ public void creatXml() { DocumentBuilder documentBuilder = this.getDocumentBuilder(); //生成document Document document = documentBuilder.newDocument(); //去掉standalone属性 document.setXmlStandalone(true); //创建bookStore节点 Element bookStore = document.createElement("bookStore"); //创建book节点 Element book1 = document.createElement("book"); Element book2 = document.createElement("book"); Element name1 = document.createElement("name"); Element author1 = document.createElement("author"); Element year1 = document.createElement("year"); Element price1 = document.createElement("price"); Element name2 = document.createElement("name"); Element author2 = document.createElement("author"); Element year2 = document.createElement("year"); Element price2 = document.createElement("price"); /*//创建文本节点 Node nameText = document.createTextNode("七龙珠"); //添加文本节点 name.appendChild(nameText);*/ name1.setTextContent("犬夜叉"); year1.setTextContent("2008"); author1.setTextContent("高桥留美子"); price1.setTextContent("200$"); book1.appendChild(name1); book1.appendChild(author1); book1.appendChild(year1); book1.appendChild(price1); //为book节点添加属性id book1.setAttribute("id", "1"); //把book节点加入到bookStore节点中 bookStore.appendChild(book1); name2.setTextContent("唐人街探案"); year2.setTextContent("2016"); author2.setTextContent("陈思成"); price2.setTextContent("VIP会员免费"); book2.appendChild(name2); book2.appendChild(author2); book2.appendChild(year2); book2.appendChild(price2); //添加第二个book bookStore.appendChild(book2); //把节点bookStore加入到document中 document.appendChild(bookStore); //使用TransformerFactory TransformerFactory factory = TransformerFactory.newInstance(); try { Transformer transformer = factory.newTransformer(); //输入节点之间的换行 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //传入document,输出流生成xml文件 transformer.transform(new DOMSource(document), new StreamResult(new File("bookCreate.xml"))); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 主程序的入口 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub TestDom testDom = new TestDom(); testDom.domParse(); testDom.creatXml(); } }
2、生成的bookCreate.xml
<?xml version="1.0" encoding="UTF-8"?><bookStore> <book id="1"> <name>犬夜叉</name> <author>高桥留美子</author> <year>2008</year> <price>200$</price> </book> <book> <name>唐人街探案</name> <author>陈思成</author> <year>2016</year> <price>VIP会员免费</price> </book> </bookStore>