Java解析XML对象

什么是JAXB

个人理解JAXB是XML和Java object之间的桥梁,能够使得XML和object之间相互转化。

如何使用JAXB

  1. 定义一个java类,用于存储转化后的对象;用注解 @XmlRootElement标记该类;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Data;

@XmlRootElement(name="test:test")
public class Test{

@XmlElement(name="test:tester")
public Tester tester;

@Data
public static class Tester{
private Name name;
private String msg;
}

@Date
public static class Name{
private String firstName;
private String lastName;

public Name(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
}
}
  1. 转换Java Object为XML字符串:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class JAXBExample {

public static exmaple(String xml) {

JAXBContext jaxbContext = JAXBContext.newInstance(Test.class);
Test test = new Test();
test.tester = new Test.Tester();
test.tester.setMsg("Example");
test.tester.setName(new Test.Name("San", "Zhang"));
try {
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(test, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
  1. 转换XML字符串为Java Object:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JAXBExample {

public static void main(String[] args) {
try {
File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Test.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file);
System.out.println(customer);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}

JAXB的优缺点

优点

  • 它比DOM或SAX解析器简单易用
  • 我们可以将XML文件编组到其他数据目标,例如inputStream,URL,DOM节点。
  • 我们可以从其他数据目标中解组XML文件。
  • 我们不需要了解XML解析技术。
  • 我们不需要总是访问树结构中的XML

缺点:

  • JAXB是高层API,因此与SAX或DOM相比,它对解析的控制更少。
  • 它有一些开销的任务,因此它比SAX慢。