• JAVA解析XML文件


     

    XML文档解析的方式4种
      1.SAX解析XML文件
      2.DOM解析XML文件
      3.JDOM解析XML文件
    4.DOM4J解析XML文件

    注意:XML文件的解析格式有两种:SAX解析和DOM解析(DOM , JDOM , DOM4J )

    下面就介绍一下JDOM解析XML文件

           步骤:
    1.创建一个DOM解析器(文档生成器)工厂对象
    2.通过工厂对象创建一个DOM解析器对象
    3.解析文档
    4.从内存中读取数据生成对象
            特点:
    1.基于树型结构,
    2.通过解析器一次性把文档加载到内存中,所以会比较占用内存,
    3.可以随机访问,更加灵活,适合web端开发.

    public void SSSXML() throws IOException, SAXException, ParserConfigurationException {
            //创建一个DOM解析器(文档生成器)工厂对象
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            //通过工厂对象创建一个DOM解析器对象
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com\\xml\\person.xml");
            //此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储;
            Document parse = documentBuilder.parse(resourceAsStream);
            //4.从内存中读取数据生成对象
    
            //获取节点名称为person的所有节点,返回节点集合.
            NodeList personNodeList = parse.getElementsByTagName("person");
            ArrayList<Person> persons = new ArrayList<>();
            Person person = null;
            //循环读取
            for (int i = 0; i < personNodeList.getLength(); i++) {
                Node personNode = personNodeList.item(i);
                person = new Person();
                //获取节点属性值;
                String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
                person.setPersonid(personid);
                //获取当前节点的所有子节点
                NodeList childNodes = personNode.getChildNodes();
                for (int j = 0; j <childNodes.getLength() ; j++) {
                    Node item = childNodes.item(j);
                    String nodeName = item.getNodeName();
                    if("name".equals(nodeName)){
                        person.setName(item.getFirstChild().getNodeValue());
                    }else if("address".equals(nodeName)){
                        person.setTel(item.getFirstChild().getNodeValue());
                    }
                    else if("tel".equals(nodeName)){
                        person.setTel(item.getFirstChild().getNodeValue());
                    }
                    else if("fax".equals(nodeName)){
                        person.setFax(item.getFirstChild().getNodeValue());
                    }
                    else if("email".equals(nodeName)){
                        person.setEmail(item.getFirstChild().getNodeValue());
                    }
                }
                persons.add(person);
            }
            System.out.println("结果:");
            for (Person person1 : persons) {
                System.out.println(person1);
            }
        }


    DOM4J解析XML文件

             步骤:
    1.创建DOM4J解析器
    2.解析文档
    3.从内存中读取数据生成对象
             特点:
    1.基于树型结构
    2.第三方组件
    3.解析速度快,效率更高,使用JAVA中的迭代器进行数据读取,在web框架中使用较多,比如(Hibernate框架)

    首先创建一个XML配置文件(解析这个文件需要导入dom4j-1.6.1.jar包,具体版本可能有新旧之分)

    <?xml version="1.0" encoding="UTF-8"?>
    <phoneInfo>2019-07-222019-07-22  
        <brand name="小米">
            <type name="小米8"/>
            <type name="小米9"/>
            <type name="小米MIX"/>
        </brand>
        <brand name="iphone">
            <type name="iphoneX"/>
            <type name="iphoneXs"/>
            <type name="iphone7"/>
        </brand>
        <brand name="华为">
            <type name="p20"/>
            <type name="p30"/>
            <type name="P30pro"/>
        </brand>
    </phoneInfo>

    下面就用这个XML文件实现增删改查

    1.查询

    package cn.kgc.dom4jtest;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import java.util.Iterator;
    
    public class Test {
        public static void main(String[] args) {
               //创建DOM4J解析器对象
            SAXReader saxReader = new SAXReader();
            try {
                //读取xml文件,并生成document对象 现可通过document来操作文档
                Document document = saxReader.read("src/info.xml");
                //获取到文档的根节点
                Element rootElement = document.getRootElement();
                System.out.println("根节点的名字是:" + rootElement.getName());
                //获取子节点列表
                Iterator it = rootElement.elementIterator();
                while (it.hasNext()) {
                    Element fistChild = (Element) it.next();
                    //System.out.println(fistChild.getName());
                    //获取节点的属性值
                    System.out.println(fistChild.attribute("name").getValue());
                    //获取子节点的下一级节点
                    Iterator iterator = fistChild.elementIterator();
                    while (iterator.hasNext()) {
                        Element element = (Element) iterator.next();
                        System.out.println("\t" + element.attributeValue("name"));
                    }
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    }

    2.添加

    package cn.kgc.dom4jtest;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    public class AddTest1 {
        /**
         * 添加节点操作
         * @param args
         */
        public static void main(String[] args) {
            //创建DOM4J解析器对象
            SAXReader saxReader = new SAXReader();
            try {
                Document document = saxReader.read("src/info.xml");
                //获取到根节点
                Element rootElement = document.getRootElement();
                //添加一个子节点
                Element brand = rootElement.addElement("brand");
                //给当前节点添加属性
                brand.addAttribute("name", "魅族");
                Element type = brand.addElement("type");
                type.addAttribute("name", "s16");
                OutputStream os = new FileOutputStream(new File("src/info.xml"));
                XMLWriter xmlWriter = new XMLWriter(os);
                xmlWriter.write(rootElement);
                xmlWriter.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    3.修改

    package cn.kgc.dom4jtest;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Iterator;
    
    /**
     * 节点修改测试
     */
    public class UpdateTest {
        public static void main(String[] args) {
            //创建DOM4J解析器对象
            SAXReader saxReader = new SAXReader();
            try {
                Document document = saxReader.read("src/info.xml");
                //获取根节点
                Element rootElement = document.getRootElement();
                Iterator it = rootElement.elementIterator();
                while (it.hasNext()) {
                    Element element = (Element) it.next();
                    System.out.println(element.attributeValue("name"));
                    if (element.attributeValue("name").equals("魅族")) {
                        Iterator iterator = element.elementIterator();
                        while (iterator.hasNext()) {
                            Element type = (Element) iterator.next();
                            if (type.attributeValue("name").equals("s16")) {
                                type.addAttribute("name", "16 pro");
                            }
                        }
                    }
                }
                XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
                xmlWriter.write(document);
                xmlWriter.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    4.删除

    package cn.kgc.dom4jtest;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Iterator;
    
    /**
     * 删除节点测试
     */
    public class DeleteTest {
        public static void main(String[] args) {
            SAXReader saxReader = new SAXReader();
            try {
                Document document = saxReader.read("src/info.xml");
                Element rootElement = document.getRootElement();
                Iterator iterator = rootElement.elementIterator();
                while (iterator.hasNext()) {
                    Element brand = (Element) iterator.next();
                    if ("魅族".equals(brand.attributeValue("name"))) {
                        //通过父节点来删除子节点
                        brand.getParent().remove(brand);
                    }
                }
                XMLWriter xmlwriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
                xmlwriter.write(document);
                xmlwriter.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    好记性不如烂笔杆android学习笔记<十四> EditText 画行,解决光标压线问题
    好记性不如烂笔杆android学习笔记<十五> GridView简单用法
    分享个好玩的算法游戏
    ubuntu环境下lnmp环境搭建(3)之Php
    数据可视化之美之疾病潜在关联
    ubuntu环境下lnmp环境搭建(2)之Nginx
    乐观锁和悲观锁
    表单无刷新上传图片
    ubuntu环境下lnmp环境搭建(1)之Mysql
    祭旗篇关于提高技术团队技术氛围的一些尝试
  • 原文地址:https://www.cnblogs.com/VisionY/p/11227990.html
Copyright © 2020-2023  润新知