由于xml的标签可以任意扩展,所以十分适合数据的结构化传输,所以以下简单讲解几种xml文档创建和解析的方法:
一.java本身就支持xml文档的创建和解析,需要使用以下几种类的支持:
org.w3c.dom.Document
org.w3c.dom.Element
javax.xml.parsers.DocumentBuilderFactory
javax.xml.transform.dom.DOMSource
javax.xml.transform.stream.StreamResult
javax.xml.transform.TransformerFactory;
javax.xml.transform.Transformer;
列举一个简单代码:
package cn.mldn.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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;
public class DocumentDemo {
public static void main(String[] args) throws Exception {
Document document=null;
//首先为实例化DocumentBuilderFactory
DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance();
//然后通过DocumentBuilderFactory为DocumentBuilder对象实例化
DocumentBuilder builder=docFactory.newDocumentBuilder();
//再通过DocumentBuilder为Document对象
document=builder.newDocument();
//通过Document对象创建一个根节点
Element root=document.createElement("books");
String bookName[]=new String[]{"java","oracle","php"};
String preice[]=new String[]{"123","456","789"};
for(int i=0;i<bookName.length;i++){
//创建book节点
Element book=document.createElement("book");
//创建name节点
Element name=document.createElement("name");
//创建price节点
Element price=document.createElement("price");
//为name节点加入文本
name.appendChild(document.createTextNode(bookName[i]));
//为price节点加入文本
price.appendChild(document.createTextNode(preice[i]));
//book节点包含name节点
book.appendChild(name);
//book节点包含price节点
book.appendChild(price);
//根节点root包含book
root.appendChild(book);
}
//整个文档包含根节点
document.appendChild(root);
TransformerFactory factory=TransformerFactory.newInstance();
Transformer tran=factory.newTransformer();
//将整个xml文档输出到d盘的demo.xml文件中
tran.transform(new DOMSource(document), new StreamResult(new File("d:"+File.separator+"demo.xml")));
}
}
代码执行完成之后,会在d盘创建demo.xml文件
demo.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books>
<book>
<name>java</name>
<price>123</price>
</book>
<book>
<name>oracle</name>
<price>456</price>
</book>
<book>
<name>php</name>
<price>789</price>
</book>
</books>
以下是xml解析的代码:
package cn.mldn.dom;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DomDemoTwo {
public static void main(String[] args) throws Exception, IOException, ParserConfigurationException {
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("d:"+File.separator+"demo.xml"));
NodeList element=document.getElementsByTagName("book");
for(int i=0;i<element.getLength();i++){
Element ele=(Element)element.item(i);
System.out.print(ele.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()+"---->");
System.out.println(ele.getElementsByTagName("price").item(0).getFirstChild().getNodeValue());
}
}
}
代码执行后结果为:
java---->123
oracle---->456
php---->789
二.由于w3c提供dom解析,会在内存中产生dom树,不适合大文本的解析操作,所以还有一种适合大文本的解析sax解析
列举一个简单代码:
package cn.mldn.dom;
import java.io.File;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
class MySax extends DefaultHandler{
@Override
public void startDocument() throws SAXException {
System.out.println("文档开始:"+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
@Override
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
System.out.println("元素开始:"+arg3);
}
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
System.out.println("元素内容:"+new String(arg0,arg1,arg2));
}
@Override
public void endElement(String arg0, String arg1, String arg2) throws SAXException {
// TODO Auto-generated method stub
System.out.println("元素结束:"+arg2);
}
@Override
public void endDocument() throws SAXException {
System.out.println("文档结束");
}
}
public class SaxDemo {
public static void main(String[] args) throws Exception {
File f=new File("d:"+File.separator+"demo.xml");
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse(f, new MySax());
}
}
但是sax解析只能完成xml文档解析的功能,不能创建xml文档。
三.还有一种更为方便的xml解析和创建的工具DOM4J
不过这是一个第三方的jar包,需要下载,可以从http://sourceforge.net网站下载
使用dom4j创建xml文档,代码如下:
package cn.mldn.dom;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
public class DOM4jDemo {
public static void main(String[] args) throws Exception {
Document document=DocumentHelper.createDocument();
Element rootElement=document.addElement("books");
for(int i=0;i<3;i++){
Element book=rootElement.addElement("book");
Element name=book.addElement("name");
Element price=book.addElement("price");
name.setText("xiaoli"+i);
price.setText("2535");
}
XMLWriter writer=new XMLWriter(new FileOutputStream(new File("d:"+File.separator+"demo.xml")));
writer.write(document);
}
}
代码执行的结果:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>xiaoli0</name>
<price>2535</price>
</book>
<book>
<name>xiaoli1</name>
<price>2535</price>
</book>
<book>
<name>xiaoli2</name>
<price>2535</price>
</book>
</books>
使用dom4解析xml文档,代码如下:
package cn.mldn.dom;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jDemoTwp {
public static void main(String[] args)throws Exception {
SAXReader reader=new SAXReader();
Document document=reader.read(new File("d:"+File.separator+"demo.xml"));
Element rootElement=document.getRootElement();
List<Element> all=rootElement.elements("book");
Iterator<Element> iter=all.iterator();
while(iter.hasNext()){
Element ele=iter.next();
System.out.print(ele.elementText("name")+"--->");
System.out.println(ele.elementText("price"));
}
}
}
代码执行结果:
xiaoli0--->2535
xiaoli1--->2535
xiaoli2--->2535
除了利用xml文档完成数据传输,还用一种更为简单的数据传输的方式:JSON
json也是一个第三方jar包:可以再www.json.org网站中下载
json中有两个重要的类JSONObject ,JSONArray
创建一个简单的json字符串:
package jsonDemo;
import net.sf.json.JSONObject;
public class JsonDemo {
public static void main(String args[]){
JSONObject jsonObject=new JSONObject();
jsonObject.put("name", "小张");
jsonObject.put("age",414);
jsonObject.put("salary",15.2);
System.out.println(jsonObject);
}
}
输出结果为:
{"name":"小张","age":414,"salary":15.2}
json解析,示例代码:
package jsonDemo;
import net.sf.json.JSONObject;
public class JsonDemo {
public static void main(String args[]){
String json="{\"name\":\"小张\",\"age\":414,\"salary\":15.2}";
JSONObject jsonObject=JSONObject.fromObject(json);
System.out.println("name: "+jsonObject.get("name")+",age: "+jsonObject.getDouble("age")+",salary:"+jsonObject.get("salary"));
}
}
执行结果:
name: 小张,age: 414.0,salary:15.2
以下再举一个稍微复杂一点的json示例: