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();
        }
    }

}
原文地址:https://www.cnblogs.com/joke0406/p/6944723.html