xml用的地方还是比较多的,使用场合比较多的是数据交换,xml的可读性虽然不错但就是体积大了点,json的话恰好相反体积小但是可读性比较差。这次准备分享的是xml的生成和解析,这次着重介绍DOM4J的使用
一 DOM,SAX解析xml的区别
1.DOM解析xml的时候会把整个xml载入内存中资源消耗有点大,可以随机读取,缺点是解析速度慢,只适合解析小型xml
2.SAX解析xml资源消耗不大,但是只能解析不能修改,适合读取复杂的xml,解析速度快
另外解析xml一般有SAX、DOM、JDOM、DOM4J这四种方法。
二.java使用dom4j解析和生成xml
1.生成xml字符串
package org.lxh;
import org.dom4j.*;
public class CreateXml {
public static void main(String[] args) {
Document doc=DocumentHelper.createDocument();
Element root=doc.addElement("OrdersInfo");
//第一个节点
Element orderItem=root.addElement("order");
orderItem.addAttribute("id", "1");
Element orderNum=orderItem.addElement("orderNum");
orderNum.addText("2014010501");
Element goods=orderItem.addElement("goods");
goods.addText("瑜伽垫");
//第二个节点
Element orderItem2=root.addElement("order");
orderItem2.addAttribute("id", "2");
Element orderNum2=orderItem2.addElement("orderNum");
orderNum2.addText("2014010504");
Element goods2=orderItem2.addElement("goods");
goods2.addText("手机");
doc.setXMLEncoding("UTF-8");
System.out.println(doc.asXML());
}
}
xml的生成比较注重层次感,应该说生成xml的代码难度其实不大
2.xml字符串的解析
package org.lxh;
import java.io.File;
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
public class ParseXml {
public static void main(String[] args) throws Exception {
//读取xml的文本文件
File f=new File("d:"+File.separator+"test2.txt");
FileInputStream in=new FileInputStream(f);
FileChannel chan=in.getChannel();
MappedByteBuffer buf=chan.map(FileChannel.MapMode.READ_ONLY, 0, f.length());
byte[] b=new byte[(int)f.length()];
int len=0;
while(buf.hasRemaining()){
b[len]=buf.get();
len++;
}
chan.close();
in.close();
Document doc=DocumentHelper.parseText(new String(b,0,len,"GBK"));
Element root=doc.getRootElement();
Iterator<Element> it=root.elementIterator();
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
//取得第二层的节点
while(it.hasNext()){
Map<String,Object> m=new HashMap<String,Object>();
Element e=it.next();
m.put("id",e.attributeValue("id"));
Iterator<Element> it2=e.elementIterator();
//取得第三层层的节点
while(it2.hasNext()){
Element child=it2.next();
if("orderNum".equals(child.getName())){
m.put("orderNum", child.getText());
}
if("goods".equals(child.getName())){
m.put("goods", child.getText());
}
}
list.add(m);
}
System.out.println(list);
}
}
我这里为了写代码方便,就直接读取了一个xml的文本文件
三 php使用SimpleXml生成xml字符串和文件
<?php
header("Content-type: text/html; charset=utf-8");
$xml=new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><UsersInfo />');
$item=$xml->addchild("item");
$item->addchild("name","冯绍峰");
$item->addchild("age","30");
$item2=$xml->addchild("item");
$item2->addchild("name","潘玮柏");
$item2->addchild("age","29");
$item2->addAttribute("id","02");
header("Content-type: text/xml");
echo $xml->asXml();
$xml->asXml("student.xml");
?>
四 php使用SimpleXml解析xml字符串
<?php
header("Content-type: text/html; charset=utf-8");
$xml=simplexml_load_file("UserInfo.xml");
//通过children取得根节点下面的子项
for($i=0;$i<count($xml->children());$i++){
foreach ($xml->children()[$i] as $key => $value ) {
echo "$key:$value"."<br/>";
}
}
?>
我们可以看出php使用SimpleXml解析xml是最简单的