XML
目录结构:
contents structure [-]
1 什么是XML
XML(eXtensible markup language) 是一种可扩展的标记语言 ,即使可以自定义标签的语言。
2 解析XML
2.1 解析的两种方式
XML的解析分为两种方式,分别是SAX和DOM。
DOM:(Document Object Model,就是文档对象模型),是W3C组织推荐的处理XML的一种方式。使用该方式解析XML文档,会把文档中的所有元素,按照其出现的层次关系,在内存中构造出树形结构。因此对内存的压力大,解析熟读慢,优点就是可以遍历和修改节点的内容。
SAX:(Simple API for XML) 是一种XML解析的替代方法。相比较于DOM,解析速度更快,内存的压力更小;缺点就是不能修改节点的内容。
2.2 使用dom4j解析XML
在使用dom4j解析XML之前需要导入相关的工具包,比如笔者的: dom4j-1.6.1.jar 包
2.2.1 dom4j的API
//创建SAXReader,是dom4j包提供的解析器 SAXReader reader=new SAXReader(); //读取指定的文件 Document doc=reader.read(new File(filename)); Document Document getRootElement() 用于获取根元素 Element Element element(String name) 获取元素下指定名称的子元素 List<Element> elements() 获取元素下所有的子元素 String getName() 获取元素名 String getText() 获取元素文本内容 String elementText(String name) 获取子元素文本内容 Attribute attribute(String) 获取元素的属性 String attributeValue(String name) 获取元素的属性值 Attribute String getName() 获取属性的名字 String getValue() 获取属性的值
2.2.2 打印一个XML文件的全部内容
pricties.xml文件直接位于项目下
<?xml version="1.0" encoding="utf-8" ?> <books id="a"> <book id="b"> <name id="c_1" name="c_2">三国演绎</name> <author id="d_1" name="d_2" >罗贯中</author> <price id="e">58.8</price> </book> <book id="f_1" name="f_2"> <name id="g">水浒传</name> <author id="h">施耐庵</author> <price id="i">49.8</price> </book> <book id="j_1" name="j_2"> <name id="k">西游记</name> <author id="l">吴承恩</author> <price id="m">100.1</price> <order>1</order> </book> </books>
import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ParseXML { public static void main(String[] args) { //创建SAXReader对象 SAXReader saxr=new SAXReader(); Document docu=null; try{ //读取指定的文件,相对于项目路径 docu=saxr.read(new File("pricties.xml")); //获得元素的文件的根节点 Element e=docu.getRootElement(); searchAllElement(e); }catch(Exception e){ e.printStackTrace(); } } public static void searchAllElement(Element e){ //获得当前元素下的所有子元素,并存储到集合中 List<Element> elements=e.elements(); System.out.print("<"+e.getName());//打印开始标记 List<Attribute> atrs=e.attributes();//打印该标记下的所有属性 for(Attribute att:atrs){ System.out.print(" "+att.getName()+"=\""+att.getValue()+"\""); } System.out.println(">"); //如果集合的大小为0,表示该集合下没有子元素了 if(elements.size()==0){ System.out.println(e.getText());//打印文本信息 System.out.println("</"+e.getName()+">");//打印结束标记 return;//退出当前层方法 } //递归每一个子元素 for(Element ele:elements){ searchAllElement(ele); } System.out.println("</"+e.getName()+">");//打印结束标记 } }
2.3 在dom4j中应用XPath解析XML
首先需要在dom4j基础上引入相应的jar包,比如读者的: jaxen-1.1-beta-6.jar
2.3.1 XPath的API
Document List<Node> selectNodes(String xpath) Node selectSingleNode(String xpath)
2.3.2 XPath的路径表达式
2.3.2.1 XPath的路径表达式规则
2.3.2.2 XPath的路径表达式应用案例
2.3.3 通配符
2.3.3.1 通配符规则
2.3.3.2 通配符应用案例
2.3.4 谓语
2.3.4.1 谓语规则
谓语是用来查找某个特定的节点或是包含某个指定的值的节点
谓语被嵌在方括号中
2.3.4.2 谓语应用案例
3 java写XML文件
3.1 将一个带有书籍信息的List集合解析为XML文件
package com.xdl.xml; public class Book { private String name; private String author; private String price; public Book() { super(); } public Book(String name, String author, String price) { super(); setName(name); setAuthor(author); setPrice(price); } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the author */ public String getAuthor() { return author; } /** * @param author the author to set */ public void setAuthor(String author) { this.author = author; } /** * @return the price */ public String getPrice() { return price; } /** * @param price the price to set */ public void setPrice(String price) { this.price = price; } }
package com.xdl.xml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.XMLWriter; public class WriteXML { public static void main(String[] args) { //创建一个Book集合用于存储书籍信息 List<Book> list_books=new ArrayList<Book>(); //插入书籍信息 for(int i=0;i<6;i++){ Book book=new Book("jame"+i,"author"+i,""+i); list_books.add(book); } //创建一个文档对象 Document doc=DocumentHelper.createDocument(); //创建一个根节点 Element books=DocumentHelper.createElement("books"); //获得书籍集合的大小 int size=list_books.size(); for(int i=0;i<size;i++){ //创建一个book节点 Element book=books.addElement("book"); //创建一个name节点 Element name=book.addElement("name"); //创建一个author节点 Element author=book.addElement("author"); //创建一个price节点 Element price=book.addElement("price"); name.setText(list_books.get(i).getName()); author.setText(list_books.get(i).getAuthor()); price.setText(list_books.get(i).getPrice()); } //设置文档根节点 doc.setRootElement(books); try { //如果文件不存在,会自动创建 FileOutputStream fos = new FileOutputStream(new File("books.xml")); XMLWriter xmlw = new XMLWriter(fos); xmlw.write(doc); xmlw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }