【JAVA WEB】学习笔记——XML解析

本文介绍XML的DOM与SAX解析方式,包括Java中使用JAXP、DOM4J进行XML文档解析与生成的方法。详细展示了如何用Java代码实现XML文档的读取、解析及生成。
  1. 解析方式:

    • DOM解析
      直接性把XML文档全部读取到内存中来,会得到一个Document对象,然后对其访问操作,DOM方式W3C推荐的一种方式
      (好处:增删改查方便)
    • SAX解析
      Simple API for XML,不是官方的标准,但他是XML领域事实上的标准
      SAX是边读取XML文档,边解析
  2. XML的解析器

    • Crimson(SUN)
    • Xerces(IBM -> Apache)
    • Aelfred(JDOM, DOM4J)
    • 第三方解析工具 JDOM,DOM4J(常用)
  3. Java里面对XML的解析工具JAXP
    JAXP方式解析XML步骤:

 //获取 DocumentBuilderFactory 实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//加载要解析的XML文档,获取Document对象
Document doc = db.parse(new FileInputStream("xmlfile/students.xml"));
//对Document对象进行操作
//动态生成xml文档,并写入文件
//获取DocumentBuilderFactory实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInsatence();
//通过Factory获取DocumentBuilder解析器对象实例
DocumentBuilder db = dbf.newDocumentBuilder();
//创建一个新的Document对象
Document doc = db.newDocument();
//添加一系列的元素
Element rootElt = doc.createElement("班级");

Element studentElt1 = doc.createElement("学生");

Element studentElt1 = doc.createElement("姓名");
studentElt1_name.setTextContent("张曼玉");
studentElt1_name.setAttribute("别名","玉姐");

Element studentElt1_sex = doc.createElement("姓名");
studentElt1_sex.setTextContent("女");

studentElt1.appendChild(studentElt1_name);
studentElt1.appendChild(studentElt1_sex);

Element studentElt2 = doc.createElement("学生");

Element studentElt2_name = doc.createElement("姓名");
studentElt2_name.setTextContent("林青霞");
studentElt2_name.setAtribute("别名","霞妹");

Element studentElt2_sex = doc.createElement("性别");
studentElt2_sex.setTextContent("女");

studentElt1.appendChild(studentElt1_name);
studentElt1.appendChild(studentElt1_sex);

rootElt.appendChild(studentElt1);
rootElt.appendChild(studentElt2);

doc.appendChild(rootElt);

//获取TransfomerFactory实例
TransformerFatory tff = TransformerFactory.newInstance();
//通过TransfomerFactory创建Transformer实例
Transformer tf = tff.newTransformer();
//通过Document生成DOMSource实例
DOMSource sourse = new DOMSource(doc);
//创建写DOM文档的输出流
StreamResult xmlResult = new StreamResult(new FileOutputStream("test.xml"));
//通过Transfomer的transform方法把DOMSource对象写入输出流
tf.transform(source,xmlResult);
  1. JAXP方式解析XML步骤(SAX方式)
    SAX解析XML步骤
SAXPerserFactory spf = ASXPerserFactory.newInstance();
ASXParser sp = spf.newSAXParser();
sp.parse("test.xml",new MyHandler() );
  1. SAX主要用于对XML文档解析,不能去修改、删除、添加元素
    SAX是推行机制,把发现的内容告诉程序员(函数),程序员可以自己下决定如何处理
    MyHandler接口:
    DefaultHandler SAX事件:
    • startDoucment()
      发现文档的开始,解析器开始扫描文件
    • endDocument()
      发现了文档尾
    • startElement()
      发现了一个起始标签,返回元素名,以及所有属性名和值
    • character()
      发现了一些文本,将得到一个字符数组,该字符数组的偏移量和长度变量,由这三个变量可以得到解析器发现的文本
    • endElement()
      发现一个结束标签,并返回元素名称

DOM4J解析XML

被解析的XML:

<?xml version="1.0" encoding="UTF-8"?>

<学生们>
    <学生>
        <学号>04142122</学号>
        <姓名>张三</姓名>
    </学生>
    <学生>
        <学号>04142138</学号>
        <姓名>李四</姓名>
    </学生>
    <学生>
        <学号>04156700</学号>
        <姓名>王五</姓名>
    </学生>
    <学生 学号="04149441" 姓名="马六" />
</学生们>

JAVA代码(引入dom4j-1.6.1包):

public class TestDOM4JParseXML {

    public static void main(String[] args) throws DocumentException {

        SAXReader reader = new SAXReader();
        FileInputStream fis = null;

        try {
            fis = new FileInputStream("XMLDemo02.xml");
            Document doc = reader.read(fis);

            //获取根元素
            Element rootElt = doc.getRootElement();
            System.out.println(rootElt.getName());
            List elements = rootElt.elements();
            System.out.println(elements.size());
            for(int i=0 ; i<elements.size();i++){
                Element elt = (Element)elements.get(i);
                System.out.println(elt.getName());
                List attrList = elt.attributes();
                for(int j=0 ; j<attrList.size() ; j++){
                    Attribute attr = (Attribute) attrList.get(j);
                    System.out.println("\t属性" + attr.getName() + " = " + attr.getValue());
                }
                List subEltList = elt.elements();
                for(int j=0 ; j<subEltList.size(); ++j){
                    Element subElt = (Element) subEltList.get(j);
                    System.out.println("\t子元素" + subElt.getName() + " : " + subElt.getText());
                }
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

结果:

学生们
4
学生
    子元素学号 : 04142122
    子元素姓名 : 张三
学生
    子元素学号 : 04142138
    子元素姓名 : 李四
学生
    子元素学号 : 04156700
    子元素姓名 : 王五
学生
    属性学号 = 04149441
    属性姓名 = 马六

递归解析XML

待解析xml

<?xml version="1.0" encoding="UTF-8"?>
<stuents id="123">
    <student>
        <name length="12">张三</name>
    </student>
    <student>
        <name length="12">李四</name>
    </student>
</stuents>

java代码:

public class TestDOM4JParseXML {
    public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        FileInputStream fis = null;

        try {
            fis = new FileInputStream("XMLDemo01.xml");

            Document doc = reader.read(fis);
            Element rootElt = doc.getRootElement();
            printElementDetail(rootElt,"");
        } catch (FileNotFoundException | DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                if(fis != null){
                    fis.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static void printElementDetail(Element elt,String str){
        System.out.print(str + elt.getName());
        List<Attribute> attrList = elt.attributes();
        int attrCount = attrList.size();
        if(attrList.size() != 0){
            System.out.print("[");
            for(int i=0 ; i<attrList.size() ; ++i){
                Attribute attr = attrList.get(i);
                System.out.print(attr.getName()+" = "+attr.getValue());
                if(i < attrCount - 1){
                    System.out.print(", ");
                }
            }
            System.out.print("]");
        }
        String text = elt.getText().trim();
        if(!"".equals(text)){
            System.out.print(": "+text);
        }
        System.out.println();
        List<Element> eltList = elt.elements();
        for(int i=0 ;i<eltList.size() ; ++i){
            Element subElt = eltList.get(i);
            printElementDetail(subElt,str + "\t");
        }
    }
}

结果:

stuents[id = 123]
    student
        name[length = 12]: 张三
    student
        name[length = 12]: 李四

生成XML

public class DOM4JCreateXML {
    /**
     * 目标XML:
     * <select name="city">
     *      <option value="1">北京市</option>
     *      <option value="2">天津市</option>      
     *      <option value="3">上海市</option>
     *      <option value="4">重庆市</option>
     * </select>
     */
    public static void main(String[] args) {
        //创建Document
        Document doc = DocumentHelper.createDocument();
        Element rootElt = doc.addElement("select");
        rootElt.addAttribute("name", "city");

        Element cityElt1 = rootElt.addElement("option");
        cityElt1.addAttribute("value", "1");
        cityElt1.addText("北京市");

        Element cityElt2 = rootElt.addElement("option");
        cityElt2.addAttribute("value", "2");
        cityElt2.addText("天津市");

        Element cityElt3 = rootElt.addElement("option");
        cityElt3.addAttribute("value", "3");
        cityElt3.addText("上海市");

        Element cityElt4 = rootElt.addElement("option");
        cityElt4.addAttribute("value", "4");
        cityElt4.addText("重庆市");


        XMLWriter writer = null;
        FileWriter fw = null;
        try {
            fw = new FileWriter("city.xml");
            //doc.write(fw);难以控制格式
            OutputFormat format = OutputFormat.createPrettyPrint();

            writer = new XMLWriter(fw,format);
            writer.write(doc);
            System.out.println("写入成功!");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                if(fw!=null){
                    fw.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值