XMLParser(xml文件解析工具)

对于这样一个xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
    <student id="00001" name="张三" sex="男" birthday="2000-10-3">
        <hobby>学习</hobby>
        <hobby>敲代码</hobby>
        <introduce>
            初中生
        </introduce>
    </student>
    <student id="00002" name="李四" sex="女" birthday="2001-10-21">
            <hobby>看书</hobby>
            <hobby>画画</hobby>
        <introduce>
           高中生
        </introduce>
    </student>
</students>

首先

InputStream is = Class.class.getResourceAsStream("/stu/aboutxml/student.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(is);

得到这个doc,我们可以理解为我们讲xml文件转换成了一个doc,可以被java认识的doc“文档”

NodeList nodeStudentlist = doc.getElementsByTagName("student");
            for (int i = 0; i < nodeStudentlist.getLength(); i++) {
                Element eleStudent = (Element) nodeStudentlist.item(i);

                    String id = eleStudent.getAttribute("id");
                    String sex = eleStudent.getAttribute("sex");

接下来我们对这个doc进行操作可以得到最大的标签集合即student标签集合
,遍历这个集合,我们可以得到每个student的属性信息,通过getAttribute得到每一个属性。每一个student标签下还有许多子标签,接下来对每一个student进行操作,就可得到其下的子标签

 Element introduce = (Element) eleStudent.getElementsByTagName("introduce").item(0);
                NodeList hobbies = eleStudent.getElementsByTagName("hobby");
                for (int j = 0; j < hobbies.getLength(); j++) {
                    String hobby  = hobbies.item(j).getTextContent();
                   
                }

对于introduce,我们只写了一对标签框,就只用一个Element接受introduce。而对于hobby有多个,则用一个Nodelist接收这个hobby集合,遍历这个集合,得到每一个hobby。
便解析了整个xml文件
接下来,我们将做一个解析工具。
思想是
第一步 我们根据path得到的这个doc“文档”,可以做成一个方法。
第二部 根据这个文档,解析最大的标签集合 做成一个方法。
第三步 根据这个集合中的每一个集合,解析其下的子标签。
其中,第二步是在第一步的基础下完成,因为要解析最大的标签集合,我们需要这个doc“文档” 和 标签名
第三步是在第二部的基础下完成,是需要大标签才能解析出来子标签。
对于解析出来的标签的处理,我们采用抽象方法,由调用者处理


public abstract class XMLParse {
    private static DocumentBuilderFactory dbf;
    private static DocumentBuilder db;

    static {
        dbf = DocumentBuilderFactory.newInstance();
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
    }

    public XMLParse() {
    }

    public static Document getDocument(String path) throws Exception {
        InputStream is = Class.class.getResourceAsStream(path);

        if (is == null) {
            throw new Exception("parse path is invalid");
        }
        return db.parse(is);

    }

    public abstract void dealElement(Element element,int index);

    public void parseTag(Document document, String tag) {
        NodeList list = document.getElementsByTagName(tag);
        for (int index = 0; index < list.getLength(); index++) {
            Element element = (Element) list.item(index);
            dealElement(element,index);
        }
    }

    public void parseTag(Element element,String tag) {
         NodeList list = element.getElementsByTagName(tag);
        for (int index = 0; index < list.getLength(); index++) {
            Element ele = (Element) list.item(index);

            dealElement(ele,index);
        }
    }

由此便得到了这个xmlParser。
我们用这个工具在解析一下xml文件

 List<StudentInfo> studentList = new ArrayList<>();
 //准备的list用于存放解析出来的信息

        new XMLParse() {
            @Override
            public void dealElement(Element element, int index) {
                StudentInfo student = new StudentInfo();
                student.setId(element.getAttribute("id"));
                student.setName(element.getAttribute("name"));
                student.setSex(element.getAttribute("sex"));           
                studentList.add(student);
            }        }.parseTag(XMLParse.getDocument("/stu/aboutxml/student.xml"),"student");
        for (StudentInfo stu: studentList) {

            System.out.println(stu.toString());
        }

new一个parser 首先得完成抽象方法。再对这个parser调用parseTag方法,传入这个doc“文档”,和标签名得到student集合。再在这个parser内部再new一个parser去处理每一个student下的introduce和hobby。

 List<StudentInfo> studentList = new ArrayList<>();
        new XMLParse() {
            @Override
            public void dealElement(Element element, int index) {
                StudentInfo student = new StudentInfo();
                student.setId(element.getAttribute("id"));
                student.setName(element.getAttribute("name"));
                student.setSex(element.getAttribute("sex"));


                new XMLParse() {
                    @Override
                    public void dealElement(Element element, int index) {
                       String introduce = element.getTextContent().trim();
                       student.setIntroduce(introduce);
                    }

                }.parseTag(element,"introduce");

                new XMLParse() {
                    @Override
                    public void dealElement(Element element, int index) {
                        String hobby = element.getTextContent();
                        student.addHobby(hobby);
                    }

                }.parseTag(element,"hobby");

                studentList.add(student);

            }

        }.parseTag(XMLParse.getDocument("/stu/aboutxml/student.xml"),"student");
        for (StudentInfo stu: studentList) {

            System.out.println(stu.toString());
        }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张嘉書

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值