XML简介
围绕XML涉及到四方面的技术:
1、数据定义Schema、DTD
2、数据解析DOM、SAX两种解析模型
3、样式风格XSTL,使用XSTL可以将XML文件中存放的内容按照指定的样式显示为HTML页面
4、实现语言JAVA,NET,JavaScript等,几乎所有的程序语言都提供支持。所有操作XML的功能都有额外的语言提供。另Java中可以使用SAX、JDOM、dom4j等API操作XML数据。
基本语法:
声明
XML声明不属于xml元素,所以不需要结束标记。
XML文档只有一个根元素,必须包含一个单独的标记来定义整个文档。
XML是大小写敏感的。
转移字符:当某个节点的数据包含大量需要转义的字符时,可以使用CDATA
以开始,以 ]]> 结束,其所包含的文本都会被当做普通文本处理,所有的特殊符号都会被忽略掉。但其中不能再包含CDATA,注意标签不能有空格。
XML解析
DOM解析
DOM解析(Document Object Mode)是一种基于对象的API,它把XML的内容加载到内存中,生成一个与XML文档内容对应的对象模型。当解析完成时,内存中会生成与XML文档的结构对应的DOM对象树。这样便能够根据树的结构,以节点形式来对文档进行操作。
特点:对于小的XML文件这样处理很方便,但遇到大的XML文件时,DOM解析占用内存比较大,而且查找速度比较慢。
通过以下三个步骤创建XML文件对应的Document对象:
DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder =builderFactory.newDocumentBuilder();
Document document = builder.parse(file);
其他方法可参考JDK,javax.xml.*; org.w3c.dom.
SAX解析
SAX解析器对XML文档解析会从XML文档开始位置起进行解析,同时根据已经定义好的事件处理器,来决定当前所解析的部分(元素、属性或元素内容)是否有必要记录并存储。
特点:效率比DOM解析优越。
SAX解析是事件驱动的,需要定义一个事件监听对象(可继承DefaultHandler类)
通过如下三个步骤建立XML解析对象:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File(""), new DefaultHandler());
其他具体方法可参考JDK:org.xml.sax.*; javax.xml.parsers.
DOM和SAX都是JDK提供的解析XML的API,但是在实际开发中很少用到,因为要重新编写大量的代码。
XML与Java类(POJO类)映射JAXB
Java对象转化成XML,marshal
XML转化为Java对象,unmarshal
此方法也是JDK提供的:javax.xml.bind.*
注解:
可参考http://liubuzhudeyun.iteye.com/blog/1518523
http://blog.sina.com.cn/s/blog_4a5ca0240100hmo9.html
Dom4j
http://www.blogjava.net/i369/articles/154264.html
http://www.ibm.com/developerworks/cn/xml/x-dom4j.html
dom4j的一个工具类:
package com.xml.dom4j; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; /** *dom4j的学习可参考官网 *下载官网: *http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/ *学习详细用法可参考具体官方API接口文档说明 */ public class XmlUtil { /** * tagName=list * 理解element是什么东西 * Element interface defines an XML element. * An element can have declared namespaces, attributes, child nodes and textual content * http://hi.daidu.com/331703405/item/d3a7388916fcc8d75e0c1d1 * @param document * @param nameSpace * @param tagName * @return */ public static ListgetElementsByNameSpace(Document document, String nameSpace, String tagName){ Map map = new HashMap(); map.put("ns", nameSpace); XPath xPath = document.createXPath("//ns:" + tagName); xPath.setNamespaceURIs(map); List list = xPath.selectNodes(document); return list; } /** * 一般项目处理的时候也可用字符串StringBuffer拼接报文 * 当大量的xml需要的时侯可用模板Freemarker模块 * @param document * @throws IOException * 来自官网API说明文档 */ public void write(Document document) throws IOException { // lets write to a file XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close(); // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); writer = new XMLWriter( System.out, format); writer.write(document); // Compact format to System.out format = OutputFormat.createCompactFormat(); writer = new XMLWriter(System.out, format); writer.write(document); } /** * tagPaht = root.response.list * @param document * @param tagPath * @return */ public static List getElementsByTagPath(Document document, String tagPath){ List list = null; Element root = document.getRootElement(); String[] tags = tagPath.split("\\."); if(tags[0].equals(root.getName())){ Element element = root; for (int i = 1; i < tags.length; i++) { if(i < tags.length - 1){ element = element.element(tags[i]); if(element == null) break; }else{ list = element.elements(tags[i]); } } } return list; } /** * 通过路径获取标签值 * tagPath = root.response.name * @param document * @param tagPath * @return */ public static String getElementTextByTagPath(Document document, String tagPath){ String text = ""; Element root = document.getRootElement(); String[] tags = tagPath.split("\\."); if(tags[0].equals(root.getName())){ Element element = root; for (int i = 1; i < tags.length; i++) { if(i < tags.length - 1){ element = element.element(tags[i]); if(element == null) break; }else{ text = element.elementText(tags[i]); } } } return text; } }
JDOM
http://wenku.baidu.com/link?url=Ld4--fSpe26yGxdBE-MsJhjDfIy4OKD8ee06aYrVWZH5Q8GqPeshPKp3DuU99OipK2b2CHi5rS8yUNtGSCk8JwZBJzHxvP6iI-lIk2kMkE3
http://www.cnblogs.com/fancyzero/archive/2012/06/09/jdom.html
http://blog.sina.com.cn/s/blog_67da087b0100i4xf.html