解析XML

来源:互联网 发布:linux ftp命令怎么用 编辑:程序博客网 时间:2024/06/05 21:00

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是学习的重点,一定要会。

    // 读取xmlpublic 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 malepublic 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_0001public 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  femalepublic 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
原创粉丝点击