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更简单一些;可以看上一篇博客