1.使用Document創建XML文檔:
注意:導包時導入org.w3c.dom的包:
創建圖書列表:
Book book1 = new Book(1, "001", "魔戒"); book1.addAuthor("托爾金"); Book book2 = new Book(2, "002", "哈利波特"); book2.addAuthor("JK 羅琳"); Book book3 = new Book(3, "004", "冰與火之歌"); book3.addAuthor("喬治馬丁"); Book book4 = new Book(4, "009", "三體"); book4.addAuthor("劉慈欣"); book4.addAuthor("楊宇昆"); List<Book> list = new ArrayList<>(); list.add(book1); list.add(book2); list.add(book3); list.add(book4);
使用Document創建XML文檔:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element bookList = doc.createElement("book-list"); for (Book b : list) { Element book = doc.createElement("book"); Attr attr = doc.createAttribute("id"); attr.setValue(String.valueOf(b.getId())); //為Book標簽添加屬性ID book.setAttributeNode(attr); Element title = doc.createElement("title"); title.appendChild(doc.createTextNode(b.getTitle())); Element isbn = doc.createElement("isbn"); isbn.appendChild(doc.createTextNode(b.getIsbn())); Element authorList = doc.createElement("author-list"); for (String string : b.getAuthors()) { Element author = doc.createElement("author"); author.appendChild(doc.createTextNode(string)); authorList.appendChild(author); } book.appendChild(title); book.appendChild(isbn); book.appendChild(authorList); bookList.appendChild(book); } doc.appendChild(bookList); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(doc), new StreamResult(new File("doc.xml")));
輸出結果:
使用Document解析XML文檔:
String file = "doc.xml"; List<Book>list = new ArrayList<Book>(); Document doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse(new File(file)); NodeList books = doc.getElementsByTagName("book"); for(int i=0;i<books.getLength();i++) { Book b = new Book(); Element book = (Element) books.item(i); String id = book.getAttribute("id"); Element title = (Element) book.getElementsByTagName("title").item(0); Element isbn = (Element) book.getElementsByTagName("isbn").item(0); NodeList authors = book.getElementsByTagName("author-list"); for(int j=0;j<authors.getLength();j++) { Element author = (Element) authors.item(j); b.addAuthor(author.getTextContent()); } b.setId(Integer.valueOf(id)); b.setTitle(title.getTextContent()); b.setIsbn(isbn.getTextContent()); list.add(b); } for (Book book : list) { System.out.println(book); }
轉換后輸出結果:
2.使用SAXParse解析XML文檔:
注意:導入包時需注意,導入simple的包:
main方法:
SAXParser parser = SAXParserFactory.newInstance() .newSAXParser(); BookHandler bookHandler = new BookHandler(); parser.parse(new File("doc.xml"), bookHandler); List<Book>list = bookHandler.list; for (Book book : list) { System.out.println(book); } System.out.println("完成");
bookHandler類()
@Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if(qName.equals("book")) { book = new Book(); book.setId(Integer.valueOf(attributes.getValue("id"))); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if(qName.equals("book")) { list.add(book); } if(qName.equals("title")) { book.setTitle(text); } if(qName.equals("isbn")) { book.setIsbn(text); } if(qName.equals("author")) { book.addAuthor(text); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); text = String.valueOf(ch,start,length); }
測試結果:
Book [id=1, isbn=001, title=魔戒, authors=[托爾金]] Book [id=2, isbn=002, title=哈利波特, authors=[JK 羅琳]] Book [id=3, isbn=004, title=冰與火之歌, authors=[喬治馬丁]] Book [id=4, isbn=009, title=三體, authors=[劉慈欣, 楊宇昆]] 完成
3.使用Simple解析XML文檔:
main方法:
Book book1 = new Book(1, "001", "魔戒"); book1.addAuthor("托爾金"); Book book2 = new Book(2, "002", "哈利波特"); book2.addAuthor("JK 羅琳"); Book book3 = new Book(3, "004", "冰與火之歌"); book3.addAuthor("喬治馬丁"); Book book4 = new Book(4, "009", "三體"); book4.addAuthor("劉慈欣"); book4.addAuthor("楊宇昆"); BookList list = new BookList(); list.add(book1); list.add(book2); list.add(book3); list.add(book4); //持久化 Persister persister = new Persister(); try { persister.write(list, System.out); } catch (Exception e) { e.printStackTrace(); }
使用注解為Book實體標注:
@Attribute private int id; @Element(required = false) private String isbn; @Element(required = false) private String title; @ElementList(name = "author-list") private ArrayList<String>authors = new ArrayList<String>();
上述注解含義:
- Attribute:標注該字段為標簽中的屬性
- Element:標注該字段為元素
- ElementList:標注為元素列表
- required:標注是否為可選屬性(true:必須有(默認為true);false:可有可無)
- name:修改字段在標簽中的名字
- root:標注該字段為XML的根
BookList類(為ArrayList做了一下包裝)
@Root(name = "book-list") public class BookList { @ElementList(name = "book",inline = true) ArrayList<Book>bookList; public BookList() { bookList = new ArrayList<Book>(); } public void add(Book book) { bookList.add(book); } }
注意:ArrayList為官方寫好的,我們是不可以改變的,也就不可以為其添加注解,所以采用一個包裝的方式,給BookList寫注解即可
在實體中,如果都不寫注解將都會顯示,如果有寫注解的,那么將只會顯示寫了注解的,其他的將不會顯示.
在轉換成XML時,推薦使用simple和SAX,而Document限於理解XML解析原理,(simple和SAX的容錯效果更好),推薦使用
常見的兩種數據傳輸的格式:XML和JSON,但是JSON更簡單一些;可以看上一篇博客