XML解析的三把利刃

Dom:

  读取xml中所有学生信息并打印
public class Dom {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        //获取解析器工厂
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //通过工厂获得解析器实现类
        DocumentBuilder db=factory.newDocumentBuilder();
        //使用解析器加载xml文档---》得到Document对象db
        Document doc= db.parse(new File("src/student.xml"));
        //获取所有学生元素对象
        NodeList nodeList=doc.getElementsByTagName("student");
        //遍历获取每一个学生元素对象
        for(int i=0;i<nodeList.getLength();i++){
            Element studentEle= (Element) nodeList.item(i);
            //获得number属性
            String number=studentEle.getAttribute("number");
            System.out.println(number);
            //获得学生元素对象下的name,age,sex子元素对象
            NodeList nodeList2=studentEle.getChildNodes();
            for(int x=0;x<nodeList2.getLength();x++){
                Node node=nodeList2.item(x);
                if(node.getNodeType()==Node.ELEMENT_NODE){
                        Element ele=(Element)node;   //获得name,age,sex内容
                        System.out.println(ele.getTextContent());
                }
            }
        }
    }
}

Dom4J解析:

//DOM4J是一个用来解析XML的框架
//DOM for java   ====>  模仿DOM,DOM4J可以看作是对原生DOM的优化
//框架是啥???
//就是由很多很多的类构成的,共同完成一个大的功能
//DOM4J与JDOM
public class DOM4J {
    //将xml文档加载,获得document对象
    //将document对象,以字符串的形式输出
    public static void main(String[] args) throws DocumentException {
        //创建解析器
        SAXReader reader = new SAXReader();
        //使用解析器加载文档
        Document document = reader.read(new File("JavaWeb2/src/student.xml"));
        //将文档对象转换成String
        String xml=document.asXML();
        System.out.println(xml);
    }
}



public class DOM4J_2 {
    //将xml文档加载,获得document对象
    //将document对象,以字符串的形式输出
    public static void main(String[] args) throws DocumentException {
        //创建解析器
        SAXReader reader = new SAXReader();
        //使用解析器加载文档
        Document document = reader.read(new File("JavaWeb2/src/student.xml"));
        //查文档中的所有学生
        //获得根元素   迭代根元素下的所有student元素
        Element students=document.getRootElement();
        Iterator<Element> it= students.elementIterator("student");
        while(it.hasNext()){
            Element student=it.next();
            //获得student元素上的number属性
            String number=student.attributeValue("number");
            System.out.println(number);
            Element stuName=student.element("name");
            String name=stuName.getText();
            //再找student元素下的name   age  sex
            //获得子元素的内容
            String age=student.elementText("age");
            String sex=student.elementText("sex");
            System.out.println(name+"==>"+age+"==>"+sex);
        }
    }
}

使用Dom4J添加属性:

public class DOM4J_3 {
    //增加一个学生   itcast_0003   jack  20
public static void main(String[] args) throws DocumentException, IOException {
    //创建解析器
    SAXReader reader = new SAXReader();
    //使用解析器加载文档
    Document document = reader.read(new File("JavaWeb2/src/student.xml"));
    //获得根元素
    Element root=document.getRootElement();
    //为根元素添加student 子元素和属性
    Element studentEle= root.addElement("student").addAttribute("number","itcast_0003");
    //为student添加name   age   sex   子元素和内容
    studentEle.addElement("name").addText("jack");
    studentEle.addElement("age").addText("20");
    studentEle.addElement("sex").addText("male");
    //回写:
       // 创建格式化器
        OutputFormat format=OutputFormat.createPrettyPrint();
       //创建写入器
        XMLWriter writer=new XMLWriter(new FileWriter("JavaWeb2/src/student.xml"),format);
          //将文档写入文件
        writer.write(document);
        //关闭资源
          writer.close();
}
}


规范化读写:解决乱码问题

//在写入和读取的如果编码不一致的话  就会导致乱码问题
//再写入时 是通过流写入的
//XMLWriter writer=new XMLWriter(new FileWriter("JavaWeb2/src/student_copy.xml"),format);
//===========================================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("JavaWeb2/src/student——copy.xml"),"UTF-8"),format);

//读取: <?xml version="1.0" encoding="UTF-8"?>
  //读取 :  format.setEncoding("UTF-8");   设置解码方式

//简单的解决方式  :  用字节流写入  不用字符流
//XMLWriter writer=new XMLWriter(new FileOutputStream("JavaWeb2/src/student_copy.xml"),format);



public class DOM4J_4
{
    //增加一个学生   itcast_0003   杰克  20
    public static void main(String[] args) throws DocumentException, IOException {
        //创建解析器
        SAXReader reader = new SAXReader();
        //使用解析器加载文档
        Document document = reader.read(new File("JavaWeb2/src/student.xml"));
        //获得根元素
        Element root=document.getRootElement();
        //为根元素添加student 子元素和属性
        Element studentEle= root.addElement("student").addAttribute("number","itcast_0003");
        //为student添加name   age   sex   子元素和内容
        studentEle.addElement("name").addText("杰克");
        studentEle.addElement("age").addText("20");
        studentEle.addElement("sex").addText("male");
        //回写:
        // 创建格式化器
        OutputFormat format=OutputFormat.createPrettyPrint();
        //创建写入器
        XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("JavaWeb2/src/student_copy.xml"),"UTF-8"),format);
        //将文档写入文件
        writer.write(document);
        //关闭资源
        writer.close();
    }
}




借助xpath表达式解析:

public class DOM4J_5
{
    public static void main(String[] args) throws DocumentException, IOException {

        //创建解析器
        SAXReader reader = new SAXReader();
        //使用解析器加载文档
        Document document = reader.read(new File("JavaWeb2/src/student.xml"));
        //新的方式
        //在此之前 必须添加在DOM4J框架lib目录下的jaxen-1.1-beta-6.jar包
        //创建xpath表达式
        String xpath="//student[@number='it_cast_0001']";
         //根据xpath找到要删除的元素
        Element stuEle= (Element) document.selectSingleNode(xpath);
          //删除
        stuEle.getParent().remove(stuEle);
        //回写:
        // 创建格式化器
        OutputFormat format=OutputFormat.createPrettyPrint();
        //创建写入器
        XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("JavaWeb2/src/student.xml"),"UTF-8"),format);
        //将文档写入文件
        writer.write(document);
        //关闭资源
        writer.close();
    }

}

Sax解析:

实现接口:
 //DefaultHandler类实现了ContentHandler接口    这里覆盖里面 需要的方法
public class MyDefaultHandler extends DefaultHandler {
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            System.out.println("文档解析开始");
        }

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            System.out.println("文档解析结束");
        }

        @Override
        //前两个参数永远为空
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            System.out.println("当前解析到"+qName+"元素");
            if(qName.equals("student")){
                String number=attributes.getValue("number");
                System.out.println(number);
            }

        }

        @Override
        //前两个参数永远为空
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            System.out.println(qName+"解析结束");
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            String str=new String(ch,start,length);
            //过滤空白字符
            str=str.trim();
            if(str.length()>0){
                System.out.println(str);
            }
        }
    }

具体实现:

public class Sax {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //获得解析器工厂
        SAXParserFactory factory= SAXParserFactory.newInstance();
        //获得解析器
        SAXParser parser=factory.newSAXParser();
        //使用解析器加载xml文档
        parser.parse(new File("src/student.xml"),new MyDefaultHandler());
    }
}
发布了12 篇原创文章 · 获赞 10 · 访问量 428

猜你喜欢

转载自blog.csdn.net/weixin_43193358/article/details/105220593