XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。
XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:
<?xml version="1.0" encoding="UTF-8"?> <employees> <employee name="zansan"> <age>30</age> </employee> <employee name="lisi"> <age>20</age> </employee> <employee name="wangwu"> <age>25</age> </employee> </employees>
DOM生成和解析XML文档
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
代码:
1 import java.io.IOException; 2 import java.io.InputStream; 3 4 import javax.xml.parsers.DocumentBuilder; 5 import javax.xml.parsers.DocumentBuilderFactory; 6 import javax.xml.parsers.ParserConfigurationException; 7 8 import org.w3c.dom.Document; 9 import org.w3c.dom.Element; 10 import org.w3c.dom.Node; 11 import org.w3c.dom.NodeList; 12 import org.xml.sax.SAXException; 13 14 public class TestXmlDom { 15 public static void main(String[] args) { 16 try { 17 //1 创建解析器工厂对象 18 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); 19 //2 由解析器工厂对象创建解析器对象 20 DocumentBuilder db = dbf.newDocumentBuilder(); 21 //得到xml文件的文件流 22 InputStream is=TestXmlDom.class.getResourceAsStream("test.xml"); 23 //3 由解析器对象对指定XML文件进行解析,构建相应DOM树,创建Document对象 24 Document doc=db.parse(is); 25 is.close(); 26 //获得employee节点集合 27 NodeList nodeList=doc.getElementsByTagName("employee"); 28 29 //得到employee节点的属性 30 for(int i=0;i<nodeList.getLength();i++){ 31 Element e=(Element)nodeList.item(i); 32 String attribute = e.getAttribute("name"); 33 System.out.println(attribute); 34 } 35 36 //得到age节点的值 37 for(int i=0;i<nodeList.getLength();i++){ 38 Node employeeNode=nodeList.item(i); 39 //得到age节点 40 Node ageNode=employeeNode.getFirstChild().getNextSibling(); 41 System.out.println(ageNode.getFirstChild().getNodeValue()); 42 } 43 44 } catch (ParserConfigurationException e) { 45 e.printStackTrace(); 46 } catch (SAXException e) { 47 e.printStackTrace(); 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } 51 } 52 }
DOM4J生成和解析XML文档
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/
dom4j官方网站就是址蛋,找半天找不包下载地址,可以下面地址下载:http://sourceforge.net/projects/dom4j/
下载解开后把dom4j-1.6.1.jar加入工程就可以了.
代码:
1 import java.io.InputStream; 2 import java.util.List; 3 4 import org.dom4j.Document; 5 import org.dom4j.DocumentException; 6 import org.dom4j.Element; 7 import org.dom4j.io.SAXReader; 8 9 10 public class TestXmlDom4J { 11 public static void main(String[] args) { 12 try { 13 //创建SAXReader对象 14 SAXReader reader=new SAXReader(); 15 //得到XML文件的文件流 16 InputStream in=TestXmlDom4J.class.getResourceAsStream("test.xml"); 17 //注意:Document对象是org.dom4j包下的Document.通过SAXReader对象的read(InputStream)方法得到Document对象 18 Document document=reader.read(in); 19 //获得根元素.注意:Element是org.dom4j包下的Element 20 Element root=document.getRootElement(); 21 //获得employee元素集合 22 List<Element> employeeElements=root.elements("employee"); 23 //遍历employeeElements得到属性name的值 24 for(Element e:employeeElements){ 25 String name=e.attributeValue("name"); 26 System.out.println(name); 27 } 28 //遍历employeeElements得到age元素的值 29 for(Element e:employeeElements){ 30 //得到age元素 31 Element a=e.element("age"); 32 //得到age元素的值 33 String age=a.getText(); 34 System.out.println(age); 35 } 36 } catch (DocumentException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 } 41 }