XML生成和解析

一.动态生成XML

1.使用Document动态生产XML

创建Document

    1.实例化Document工厂:DocumentBuilderFactory

    2.实例化Document构造器:DocumentBuilder

    3.实例化Document:Document

    4.创建标签:document.createElement();

    5.创建属性:document.createAttribute();

    6.建立关系:appendChild();

将Document保存到本地XML中

    1.实例化转换器工厂:TransFormerFactory

    2.实例化转化器:Transformer

    3.设置来源:Source:DOMSource

    4.设置目的地:Result:StreamResult

    5.转换:transform();


代码实现

/**
 * 创建XML 使用Document
 * @author Cookie
 *
 */
public class TestCreateXMlByDocument {
    public static void main(String[] args) {
        try {
            //1.实例化DocumentBuilderFactory
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            //2.通过dbf获取DocumentBuilder
            DocumentBuilder db=dbf.newDocumentBuilder();
            //3.创建Document
            Document document=db.newDocument();
            
            //4.创建标签<persons>
            Element elementPersons=document.createElement("persons");
            //创建<person>
            Element elementPerson=document.createElement("person");
            //创建<page>
            Element elementPage=document.createElement("page");
            //给标签设值
            elementPage.setTextContent("22");
            //创建<psex>
            Element elementPsex=document.createElement("psex");
            elementPsex.setTextContent("男");
            
            //5.创建属性
            Attr attrPid=document.createAttribute("pid");
            //给属性设值
            attrPid.setValue("1");
            Attr attrPname=document.createAttribute("pname");
            attrPname.setValue("hug");
            
            //6.建立关系
            document.appendChild(elementPersons);
            elementPersons.appendChild(elementPerson);
            elementPerson.appendChild(elementPage);
            elementPerson.appendChild(elementPsex);
            elementPerson.setAttributeNode(attrPid);
            elementPerson.setAttributeNode(attrPname);
            
            System.out.println("创建OK");
            
            
            //将生成的Document保存到XML文件中
            //1.实例化转换器工厂
            TransformerFactory tff=TransformerFactory.newInstance();
            //2.通过tff获取转换器
            Transformer transformer=tff.newTransformer();
            
            //来源
            DOMSource source=new DOMSource(document);
            //结果
            StreamResult streamResult=new StreamResult(new File("my.xml"));
            
            //3.开始转换
            transformer.transform(source, streamResult);
            
            System.out.println("保存成功");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}




2.dom4j

创建Document

    1.使用DocumentHelper创建Document

    2.添加标签:addElement(“标签名”);

    3.添加属性:addAttribute(“属性名”,“属性值”);

将Document保存到本地XML中

    1.实例化输出格式:OutputFormat.createPrettyPrint()

    2.指定输出文件路径:XMLWriter


3.直接将对象集合,使用c标签展示到XML文件中

    1.将对象集合保存到请求域中

    2.在jsp页面,使用C标签编译对象集合


二.XML解析

1.DOM(Document Object Model 文档对象模型)解析

   1.实例化Document工厂:DocumentBuilderFactory

   2.实例化Document构造器:DocumentBuilder

   3.通过构造器读取数据(解析数据):parse()

   4.得到根节点:getDocumentElement()

   5.得到根节点下面的所有子节点(NodeList):getChildNodes()

   6.遍历所有的子节点,得到某一个子节点item()

   7.得到属性的值:getAttribute(“属性名”)

   8.判断是否是标签:node.getNodeType==Node.ELEMNT_NODE

   9.得到标签内容:getTextContent()


2.Dom4j解析(Jaxp,JDOM)

   1.实例化SAX读取器:SAXReader

   2.读取:read()

   3.得到根节点:getRootElement()


3.SAX解析(XML:Simple API for XML)

   1.实例化SAX解析器工厂:SAXParserFactory

   2.实例化SAX解析器:SAXParser

   3.开始解析:parse()方法


4.DOM 和 SAX 解析区别:

   1.DOM解析占用内存比较大,但是方便对XML进行CRUD(增删查改)

   2.SAX优点是占用内存小,解析速度快,缺点只适合做文档读取,不适合做CRUD


代码实现XML解析

package com.zking.test;

import Java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 使用DOM解析XML
 * @author Administrator
 *
 */
public class TestParseXMLByDOM {
    
    public static void main(String[] args) {
        try {
            //1.实实例化DocumentBuilderFactory
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            //2.通过dbf获取DocumentBuilder
            DocumentBuilder db=dbf.newDocumentBuilder();
            //3.解析
            Document document=db.parse(new File("students.xml"));
            //4.获取跟节点<students>
            Element students=document.getDocumentElement();
            //5.获取所有的<student>节点
           //第一种方法
             NodeList nodeList=students.getElementsByTagName("student");
            for (int i = 0; i < nodeList.getLength(); i++) {
                //node element
                Element student=(Element) nodeList.item(i);
                //获取属性
                String sid=student.getAttribute("sid");
                String sname=student.getAttribute("sname");
                
                //获取<student>下面的<sage><ssex>
                Element elementSage=(Element) student.getElementsByTagName("sage").item(0);
                Element elementSsex=(Element) student.getElementsByTagName("ssex").item(0);
                
                String sage=elementSage.getTextContent();
                String ssex=elementSsex.getTextContent();
                
                System.out.println(sid+" "+sname+" "+sage+" "+ssex);
               //第二种方法
                //获取<student>下面的<sage><ssex>
                /*NodeList nodeListChild=student.getChildNodes();
                for (int j = 0; j < nodeListChild.getLength(); j++) {
                    Node node=nodeListChild.item(j);
                    if(node.getNodeType()==Node.ELEMENT_NODE){
                        Element element=(Element) nodeListChild.item(j);
                        //获取标签的名字
                        String elementName=element.getNodeName();
                        if("sage".equals(elementName)){
                            //获取<sage>的值
                            String sage=element.getTextContent();
                            System.out.println("  "+sage);
                        }else if("ssex".equals(elementName)){
                            String ssex=element.getTextContent();
                            System.out.println("  "+ssex);
                        }
                    }
                }*/

            }
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


三.XML的CRUD

1.使用DOM增删查改

   添加(在某个节点之前插入):insertBefore()

   删除:removeChild()

2.XPath(在XML文档中查找信息的语言)

  得到Document:1.实例化SAX读取器:SAXReader

                         2.读取:read()

                         3.得到根节点:getRootElement()

  标签:

          获取所有:persons.selectNodes(“/persons/person”);

          取n个位置之后的:persons.selectNodes("/persons/person[position()>n]/pname");

          取a--b之间的:persons.selectNodes("/persons/person[position()>a and position()<b]/pname");

          取奇数位数据:persons.selectNodes("/persons/person[position() mod 2!=0]/pname");

          获取第一个:persons.selectSingleNode("/persons/person[1]/pname");

          获取最后一个:persons.selectSingleNode("/persons/person[last()]/pname");

          获取第N个:persons.selectSingleNode("/persons/person[n]/pname");

   

  属性:

         取所有的属性值:persons.selectNodes("/persons/person/@属性名");

         取某个属性X的值为Y的数据:persons.selectNodes("/persons/person[@x='y']/pname");

发布了41 篇原创文章 · 获赞 1 · 访问量 6768
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章