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,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,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 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是最简单的