解析XML

1 篇文章 0 订阅

1.什么是解析xml?

系统最终会从xml中读取数据.读取的过程就是解析.
CRUD => 增删改查 => create read update delete => 解析指的就是读.

2.什么是解析器?

就是用来解析xml的类.
过滤器,拦截器,监听器....都是具备相应功能的java类而已.

3.两个常见的解析xml的思路!.

思想: 
DOM:将文档中所有内容都封装成对象.读取时,将所有对象都加载到内存中.在内存中创建一颗dom树(记录对象间的关系).
    优点: 方便的进行增删改查.
    缺点: 会非常消耗内存.
sax:事件驱动的.与pull解析(安卓)类似.把xml文档的 读取过程,划分出5类事件.我们只要提供遇到每类事件做什么的锦囊即可.
    优点:内存占用小.
    缺点: 不能进行增删改的操作.

DOM解析是由w3c推荐提出的.
Sax解析是由民间提出的.

DOM:

    把所有内容封装成了5类对象.
        document
        Element
        Attribute
        Text
        Commons
        共同的父类
        node
        NOde的属性:
            自身属性:
                nodeType
                nodeName
                nodeValue
            导航属性
                找子节点的:firstChild lastChild childNodes
                找父节点的:parentNode
                找兄弟节点:nextSibling previousSibling
    获得Element的方式
        getElementById           ==> Document
        getELementsByTagName     ==> Document/Element
        getELementsByClassName   ==> Document/Element
        getElementsByName        ==> Document
    对于增删改的操作:
        创建一个元素: document.createElement
        添加一个元素: element.appendChild ,element.insertBefore
        替换一个元素: element.replaceChild
        删除一个元素: element.removeChild

3.JAXP ==> JDK提供的 ==> java api for xml parser

思想在java中的体现是接口. 
我们要开发的话需要接口的实现类.
由各大解析器厂商提供实现接口的类.

A a  = new AImpl(); // Aimpl2;
A a  = new AImpl2();

//—上面的切换实现类的方式,需要该源代码,太过原始—–
A a = JAXP.getXXX();==> 配置文件 ==> 我们通过修改配置文件就可以实现切换实现类.

//反射.泛型.

//——————————————————————————————
DOM4J ==> 框架 ==>
Dom for java
DOM4J
//——————————————————————————————-
DOM4J 整合两种思想.(SAX DOM)的思想.
使用sax的思想做读取xml.
又参照dom的思想,也在内存中创建了一颗对象关系树. 我们在学习的时候,参照之前我们学习的dom树即可.

//使用dom4j如何避免乱码?
//要保证写入的编码和读取的编码一致.
    1.写入的编码如何控制?
        XMLWriter writer = new XMLWriter(new PrintWriter("src/students_copy.xml","UTF-8"),format);
    2.读取的编码如何控制?
        <?xml version="1.0" encoding="GBK"?>,其中encoding属性决定了读取时采用什么编码,而encoding属性由format.setEncoding("GBK");控制.
//其实要保证不乱码上面的方法太弱了!
    方法: 使用字节流绝对不会出现乱码!如下:
    XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"),format);

JAXP

这是配置文件的简单实现

public class BeanFactory {
    private static  Properties prop = new Properties();
    static{
        //1.读取配置文件
            try {
                prop.load(new FileInputStream("src/beanFactory.properties"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

    public static <T> T getBean(Class<T> c){
        //1.读取配置文件
        try {
            //2.取出用哪个实现类
            String className  = prop.getProperty(c.getSimpleName());
            //3.根据完整类名创建实例并返回
            Class<T> clazz = (Class<T>) Class.forName(className);
            return clazz.newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        return null;
    }
}

Dom4J解析案例

dom4j是学习的重点,一定要会。

    // 读取xml
public class Demo1 {
    public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(new File("src/students.xml"));

            System.out.println(document.asXML());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
// 查询出所有学生的所有信息
public class Demo2_2 {
    public static void main(String[] args) {
        try {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
    //1.获得根元素
        Element root = document.getRootElement();
    //2.迭代根元素下的所有名叫student的子元素
        List<Element> list = root.elements("student");
        for(Element student : list){
    //3.获得student元素的number属性
            String number = student.attributeValue("number");
    //4.student子元素的内容(name age sex)
            String name = student.elementText("name");
            String age = student.elementText("age");
            String sex = student.elementText("sex");

            System.out.println("当前学生的学号是"+number+",姓名是:"+name+",年龄是:"+age+",性别是"+sex+"");
        }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
// 查询出所有学生的所有信息
public class Demo2 {
    public static void main(String[] args) {
        try {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
    //1.获得根元素
        Element root = document.getRootElement();
    //2.迭代根元素下的所有名叫student的子元素
        for(Iterator<Element> it = root.elementIterator("student");it.hasNext();){
                Element student = it.next();
    //3.获得student元素的number属性
            String number = student.attributeValue("number");
    //4.student子元素的内容(name age sex)
            String name = student.elementText("name");
            String age = student.elementText("age");
            String sex = student.elementText("sex");

            System.out.println("当前学生的学号是"+number+",姓名是:"+name+",年龄是:"+age+",性别是"+sex+"");
        }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
// 增加一个学生元素. jack itcast_0003 19 male
public class Demo3 {
    public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(new File("src/students.xml"));

            //1 获得根元素
            Element root = document.getRootElement();
            //2 添加Element,添加number属性,
            Element studentEle = root.addElement("student").addAttribute("number", "itcast_0003");
            //3 添加name age sex 子元素并添加子元素中的文本
            studentEle.addElement("name").addText("张三");
            studentEle.addElement("age").addText("19");
            studentEle.addElement("sex").addText("male");
            //4 将document对象写到文件中.
                //创建格式化器
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("UTF-8");
                //创建写入器
                //XMLWriter writer = new XMLWriter(new FileWriter("src/students_copy.xml"),format);
                XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"),format);
                //写入
                writer.write(document);
                //关闭资源
                writer.close();
// 删除一个学生 itcast_0001
public class Demo4 {
    public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(new File("src/students.xml"));
            //1 获得根元素
            Element root = document.getRootElement();
        //使用xpath找到我们需要元素
                //定义xpath
            String xpath = "//student[@number='itcast_0001']";
            Element student =  (Element) document.selectSingleNode(xpath);
        //删除
            System.out.println(student.getParent().remove(student));

        //回写
            XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), OutputFormat.createPrettyPrint());

            writer.write(document);

            writer.close();



        //下面这个思路可以.但是效率太低.
            //2 获得所有学生元素
            //3 遍历
                //判断=>number属性是否为要删除的
                    //是==>删除
                    //不是
            //4 回写
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
//修改一个学生 itcast_0001 ==>  rose  16  female
public class Demo5 {
    public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(new File("src/students.xml"));
            //1.定义xpath表达式
            String xpath ="//student[@number='itcast_0001']";

            //2.使用xpath查找

            Element studentEle = (Element) document.selectSingleNode(xpath);
            //3.修改student元素的子元素的name ,age .sex内容

            studentEle.element("name").setText("rose");
            studentEle.element("age").setText("16");
            studentEle.element("sex").setText("female");

        //回写
            XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), OutputFormat.createPrettyPrint());

            writer.write(document);

            writer.close();



        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

crud

public class StudentDaoImpl implements StudentDao {

    @Override
    public void saveStudent(Student stu) {
        try {
            Document doc = getDocument();
            Element root = doc.getRootElement();
            // 4.在根元素上添加student子元素,添加属性
            Element studentEle = root.addElement("student").addAttribute(
                    "number", stu.getNumber());
            // 5. 在student上添加name,age,sex子元素并添加内容
            studentEle.addElement("name").setText(stu.getName());
            studentEle.addElement("age").setText(stu.getAge() + "");
            studentEle.addElement("sex").setText(stu.getSex());
            save2File(doc);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void save2File(Document doc) throws UnsupportedEncodingException,
            FileNotFoundException, IOException {
        // 6.回写
        // 1>创建OutputFormat
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");
        // 2>创建xmlwriter
        XMLWriter writer = new XMLWriter(new FileOutputStream(
                "src/students_copy.xml"), format);
        // 3>写入
        writer.write(doc);
        // 4>释放资源
        writer.close();
    }

    private Document getDocument() throws DocumentException {
        // 1.创建解析器
        SAXReader reader = new SAXReader();
        // 2.加载xml文件 ==> doc
        Document doc = reader.read(new File("src/students_copy.xml"));
        // 3.获得根元素
        return doc;
    }

    @Override
    public void deleteStudent(String number) {
        try {
            Document doc = getDocument();
            Element root = doc.getRootElement();
            Iterator<Element> it = root.elementIterator("student");
            while(it.hasNext()){
                Element student = it.next();
                if (student.attributeValue("number").equals(number)) {
                    student.getParent().remove(student);
                }
            }
            save2File(doc);
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    @Override
    public void deleteStudent(Student stu) {

        try {

            Document doc = getDocument();
            Element root = doc.getRootElement();
            Iterator<Element> it = root.elementIterator("student");
            while(it.hasNext()){
                Element student = it.next();
                if (student.attributeValue("number").equals(stu.getNumber())) {
                    student.getParent().remove(student);
                }
            }
            save2File(doc);
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void updateStudent(Student stu) {

    }

    @Override
    public Student getStudentByNumber(String number) {

        try {
            Student students = new Student();
            Document doc = getDocument();
            Element root = doc.getRootElement();
            List<Element> list = root.elements("student");
            for(Element student : list){
                if(student.attribute("number").getValue().equals(number)){
                    String name = students.getName();
                    name=student.elementText("name");
                    int age = students.getAge();
                    age =Integer.parseInt( student.element("age").getText());
                    String sex = students.getSex();
                    sex = student.element("sex").getText();
                    String num = students.getNumber();
                    num = student.attribute("number").getValue();
                    students.setAge(age);
                    students.setName(name);
                    students.setNumber(number);
                    students.setSex(sex);
                    return students;
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public List<Student> getAllStudent()  {
        Document doc;
        List<Student> li = new ArrayList();

        try {
            doc = getDocument();
            Element root = doc.getRootElement();
            List<Element> list = root.elements("student");
            for(Element s : list){
                Student s1 = new Student();
                String name = s.elementText("name");
                String sex = s.elementText("sex");
                String age = s.elementText("age");
                String number = s.attributeValue("number");
                s1.setAge(Integer.parseInt(age));
                s1.setName(name);
                s1.setSex(sex);
                s1.setNumber(number);
                li.add(s1);
            }

        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return li;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值