java xml 文件解析

1、new 一个 SAXReader 对象
2、调用 SAXReader 的 read 方法,获取一个 Document 对象
3、通过调用 Document 的 getRootElement 方法,来获取xml文件的根节点 Element 对象

原始test.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student number="001">
        <name>张三</name>
        <age>18</age>
        <sex>男</sex>
    </student>
    <student number="002">
        <name>李四</name>
        <age>19</age>
        <sex>女</sex>
    </student>
    <student number="003">
        <name>王五</name>
        <age>20</age>
        <sex>未知</sex>
    </student>
</students>

使用 dom4j 技术,解析代码如下:

package com.zhuchun.stu;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

/**
* @Project:cicpx-autotest
* @Description:
* @Auther: zhuchun92@163.com
* @Date: 2020年03月26日 0:25
*/
public class TestXml {
    public static void main(String[] args) throws DocumentException {
        String filepath = "src/main/resources/test.xml";
        parseXML(filepath);
    }
    // 加载 XML 文件
    // 使用 dom4j 技术
    public static void parseXML(String filepath) throws DocumentException {
        // 创建解析器对象 SAXReader
        SAXReader saxReader = new SAXReader();
        // 获取 document 对象
        Document document = saxReader.read(new File(filepath));
        // 获取根元素
        Element rootElement = document.getRootElement();
        List<Element> list = rootElement.elements("student");    // 返回是个 List 集合
        for (Element studentelement : list){
            String number = studentelement.attributeValue("number");
            Element nameElement = studentelement.element("name");
            Element ageElement = studentelement.element("age");
            Element sexElement = studentelement.element("sex");
            String name = nameElement.getText();
            String age = ageElement.getText();
            String sex = sexElement.getText();
            System.out.println("number="+number+",name="+name+",age="+age+",sex="+sex);
        }
    }
}

练习:
有如下xml:

<?xml version="1.0" encoding="UTF-8"?>
<Page keyword="注册页">
<UIElement keyword="用户名" by="id" value="mobilephone"></UIElement>
<UIElement keyword="密码" by="id" value="password"></UIElement>
<UIElement keyword="重复密码" by="id" value="pwdconfirm"></UIElement>
<UIElement keyword="注册按钮" by="id" value="signup-button"></UIElement>
<UIElement keyword="错误提示" by="id" value="//form/div[4]/div/label/p"></UIElement>
</Page>

定义一个XMLUtil类,定义一个load方法,要求利用 dom4j解析技术完成数据解析封装,再返回Page对象,
1、根据xml结构设计 Page,此Page对象必须包括keyword属性值和所有子元素信息
2、的所有属性值要求封装在Locator类中,请设计Locator类的属性

1、 准备一个Page.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<Page keyword="注册页">
    <UIElement keyword="用户名" by="id" value="mobilephone"></UIElement>
    <UIElement keyword="密码" by="id" value="password"></UIElement>
    <UIElement keyword="重复密码" by="id" value="pwdconfirm"></UIElement>
    <UIElement keyword="注册按钮" by="id" value="signup-button"></UIElement>
    <UIElement keyword="错误提示" by="id" value="//form/div[4]/div/label/p"></UIElement>
</Page>

2、准备一个 Locator 类

package com.zhuchun.homework;

/**
* @Project:cicpx-autotest
* @Description:
* @Auther: zhuchun92@163.com
* @Date: 2020年03月28日 15:00
*/
public class Locator {
    private String keyword;
    private String by;
    private String value;

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getBy() {
        return by;
    }

    public void setBy(String by) {
        this.by = by;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString(){
        return "keyword="+this.keyword+",by="+this.by+",value="+this.value;
    }
}

3、准备一个 Page 类

package com.zhuchun.homework;

import java.util.List;

/**
* @Project:cicpx-autotest
* @Description:
* @Auther: zhuchun92@163.com
* @Date: 2020年03月28日 14:59
*/
public class Page {
    private String keyword;
    private List<Locator> locator;

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public List<Locator> getLocator() {
        return locator;
    }

    public void setLocator(List<Locator> locator) {
        this.locator = locator;
    }
}

4、编写 XMLUtil 类

package com.zhuchun.homework;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
* @Project:cicpx-autotest
* @Description:
* @Auther: zhuchun92@163.com
* @Date: 2020年03月28日 14:42
*/
public class XMLUtil {
    /*
    有如下xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <Page keyword="注册页">
        <UIElement keyword="用户名" by="id" value="mobilephone"></UIElement>
        <UIElement keyword="密码" by="id" value="password"></UIElement>
        <UIElement keyword="重复密码" by="id" value="pwdconfirm"></UIElement>
        <UIElement keyword="注册按钮" by="id" value="signup-button"></UIElement>
        <UIElement keyword="错误提示" by="id" value="//form/div[4]/div/label/p"></UIElement>
    </Page>

    定义一个XMLUtil类,定义一个load方法,要求利用 dom4j解析技术完成数据解析封装,再返回Page对象,
    1、根据xml结构设计 Page,此Page对象必须包括keyword属性值和所有子元素<UIElement>信息
    2、<UIElement>的所有属性值要求封装在Locator类中,请设计Locator类的属性
     */
    public static void main(String[] args) {
        String path = "src/main/resources/Page.xml";
        Page page = load(path);
        System.out.println(page.getKeyword());
        List<Locator> locators = page.getLocator();
        for (Locator locator : locators){
            System.out.println(locator.toString());
        }

    }
    public static Page load(String path)  {
        // 1.获取解析器
        SAXReader saxReader = new SAXReader();
        // 准备一个 Page 对象
        Page page = new Page();
        // 2.获取document对象
        Document document = null;
        try {
            document = saxReader.read(new File(path));
            // 3.获取根节点
            Element rootElement = document.getRootElement();
            String rootKeyword = rootElement.attributeValue("keyword");
            page.setKeyword(rootKeyword);
            // 4.通过根节点遍历元素
            List<Element> uiElemnts = rootElement.elements("UIElement");
            // 准备几个集合来保存所有的 Locator 对象,最后需要设置给 Page 对象
            List<Locator> LuiElements = new ArrayList<Locator>();
            for (Element uiElement : uiElemnts){
                String uiElementKeyword = uiElement.attributeValue("keyword");
                String uiElementBy = uiElement.attributeValue("by");
                String uiElementValue = uiElement.attributeValue("value");
                // 准备 Locator 对象
                Locator locator = new Locator();
                // 将 keyword 属性值封装进对象
                locator.setKeyword(uiElementKeyword);
                locator.setBy(uiElementBy);
                locator.setValue(uiElementValue);
                // 将封装好的 Locator 对象装进集合
                LuiElements.add(locator);
            }
            page.setLocator(LuiElements);

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return page;
    }
}

5、方法二:通过反射的方法来实现

package com.zhuchun.homework.reflactionstu;

import com.zhuchun.homework.xmlstu.Locator;
import com.zhuchun.homework.xmlstu.Page;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
* @Project:cicpx-autotest
* @Description:
* @Auther: zhuchun92@163.com
* @Date: 2020年03月28日 14:42
*/
public class XMLUtil {
    /*
    有如下xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <Page keyword="注册页">
        <UIElement keyword="用户名" by="id" value="mobilephone"></UIElement>
        <UIElement keyword="密码" by="id" value="password"></UIElement>
        <UIElement keyword="重复密码" by="id" value="pwdconfirm"></UIElement>
        <UIElement keyword="注册按钮" by="id" value="signup-button"></UIElement>
        <UIElement keyword="错误提示" by="id" value="//form/div[4]/div/label/p"></UIElement>
    </Page>

    定义一个XMLUtil类,定义一个load方法,要求利用 dom4j解析技术完成数据解析封装,再返回Page对象,
    1、根据xml结构设计 Page,此Page对象必须包括keyword属性值和所有子元素<UIElement>信息
    2、<UIElement>的所有属性值要求封装在Locator类中,请设计Locator类的属性
     */
    public static void main(String[] args) {
        String path = "src/main/resources/Page.xml";
        Page page = load(path);
        System.out.println(page.getKeyword());
        List<Locator> locators = page.getLocator();
        for (Locator locator : locators){
            System.out.println(locator.toString());
        }

    }

    // 通过 <UIElement> 反射成 Locator 对象来实现
    public static Page load(String path)  {
        // 1.获取解析器
        SAXReader saxReader = new SAXReader();
        // 准备一个 Page 对象
        Page page = new Page();
        // 2.获取document对象
        Document document = null;
        try {
            document = saxReader.read(new File(path));
            // 3.获取根节点
            Element rootElement = document.getRootElement();
            String rootKeyword = rootElement.attributeValue("keyword");
            page.setKeyword(rootKeyword);
            // 4.通过根节点遍历元素
            List<Element> uiElemnts = rootElement.elements("UIElement");
            // 准备几个集合来保存所有的 Locator 对象,最后需要设置给 Page 对象
            List<Locator> LuiElements = new ArrayList<Locator>();
            // 循环处理所有子元素 <UIElement>
            Class<Locator> clazz = Locator.class;
            for (Element uiElement : uiElemnts){
                // 把每一个<UIElement>封装为Locator对象
                Locator locator = clazz.newInstance();
                // 通过反射获取要调用的方法
                List<Attribute> uieAttributes = uiElement.attributes();
                for (Attribute uiAttribute : uieAttributes){
                    // 获得属性名
                    String attributeName = uiAttribute.getName();
                    // 获得属性名首字母设置为大写
                    String firstChar = attributeName.substring(0,1).toUpperCase();
                    // 获得属性名剩余字符
                    String remianChars = attributeName.substring(1);
                    // 拼接调用反射的 set 方法名
                    String methodName = "set"+ firstChar + remianChars ;
                    // 通过反射得到要调用的方法对象
                    Method method = clazz.getMethod(methodName,String.class);
                    // 获得属性值
                    String attributeValue = uiAttribute.getValue();
                    // 通过反射调用方法
                    method.invoke(locator,attributeValue);
                }
                LuiElements.add(locator);
            }
            page.setLocator(LuiElements);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return page;
    }
}