json与xml创建与解析

由于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示例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值