jdk支持java 和xml 打交道,并且方式相当多。下面从两个角度说下java 和 xml的交互形式。
1、xml的解析。
xml的解析大抵有两种方式:
DOM 和 SAX 以及StAX。
DOM:就是基于w3c的DOM模型,在内存中读入一棵xml 的dom模型树结构。
相关api在:org.w3c.dom 包里。
SAX:基于事件解析的xml处理方式,每次遇到xml元素的时候,进行方法回调。
相关的api在:org.xml.sax 包里。
StAX:基于事件的xml解析方式,但是非回调。
相关api在:javax.xml.stream包里。
另外:StAX其实和SAX的处理的方式是一致的,都是基于事件,
只是SAX 是push 推的方式,由parse 调用 application的方式,而 StAX 则是相反由application调用parse,这种方式比较好理解,更符合我们程序的调用习惯。
JAXP: 意为Java API for XML Processing。因为 dom 和 sax 有多种实现方式,所以sun又提供了dom 和 sax的 工厂方法,一般建议使用JAXP的工厂方法的形式。
相关api在:javax.xml.parsers 包里。
api有:
/** dom: jaxp通过下面两个工厂类,创建org.w3c.dom.Document 对象完成对xml的解析和处理。
*/
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
org.w3c.dom.Document ;
/** sax:jaxp通过下面两个工厂类 创建 org.xml.sax.helpers.DefaultHandler进行回调解析完成xml的解析。
*/
javax.xml.parsers.SAXParser;
javax.xml.parsers.SAXParserFactory;
org.xml.sax.helpers.DefaultHandler;
DOM举例:
public static void main(String[] args) throws Exception {
// Document doc =
// DocumentBuilderFactoryImpl.newInstance().newDocumentBuilder().newDocument();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder
.parse("D:\\qunarProject\\tts_tuan\\src\\test\\java\\com\\qunar\\test\\1.xml");
NodeList nodeList = doc.getElementsByTagName("data");
for (int i = 0; i < nodeList.getLength(); i++) {
Element ele = (Element)nodeList.item(i);
NodeList list = ele.getChildNodes();
for(int j =0;j<list.getLength();j++){
Node node = list.item(j);
System.out.println("-:" + node.getNodeName());
System.out.println("--:" + node.getTextContent());
}
}
}
SAX举例:
public static void main(String[] args) throws Exception {
SAXParser parse = SAXParserFactory.newInstance().newSAXParser();
File f = new File(
"D:\\qunarProject\\tts_tuan\\src\\test\\java\\com\\qunar\\test\\1.xml");
parse.parse(f, new DefaultHandler() {
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument");
}
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument");
};
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
System.out.println(localName);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println(localName);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch, start, length));
}
});
}
StAX举例:
<?xml version="1.0" encoding="UTF-8"?>
<data>
aaa<name>admin</name>bbb
ccc<password>123456</password>ddd
</data>
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream(
"D:\\qunarProject\\tts_tuan\\src\\test\\java\\com\\qunar\\test\\1.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(in);
while (true) {
int event = parser.next();
if (event == XMLStreamConstants.END_DOCUMENT) {
parser.close();
break;
} else if (event == XMLStreamConstants.START_ELEMENT) {
System.out.println(parser.getLocalName());
} else if (event == XMLStreamConstants.CHARACTERS) {
System.out.println(parser.getText());
}else if (event == XMLStreamConstants.END_ELEMENT) {
System.out.println(parser.getLocalName());
}
}
}
2、xml的数据绑定。
是从java对象POJO和xml数据之间的转换的思路。 从面向对象的角度来处理javabean 和xml 数据的对象关系,在系统中经常使用。
java提供的工业标准是:JAXB。
举例:
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
class User{
@XmlElement(name = "uname")
private String username;
@XmlElement(name = "pword")
private String password;
public User(String u,String p){
this.username = u;
this.password = p;
}
public User(){}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@XmlRootElement(name = "team")
@XmlAccessorType(XmlAccessType.FIELD)
class Team{
@XmlElementWrapper(name = "userList")
@XmlElement(name = "user")
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
public class JaxbTest {
public static void main(String[] args) throws Exception {
List<User> userList = new ArrayList<User>();
for(int i=0;i<2;i++){
userList.add(new User("name"+i,"pword"+i));
}
Team team = new Team();
team.setUserList(userList);
JAXBContext context = JAXBContext.newInstance(User.class,Team.class);
Marshaller marshaller= context.createMarshaller();
marshaller.marshal(team, System.out);
}
}
输出:
<?xml version="1.0" encoding="utf-8"?>
<team>
<userList>
<user>
<uname>name0</uname>
<pword>pword0</pword>
</user>
<user>
<uname>name1</uname>
<pword>pword1</pword>
</user>
</userList>
</team>