反射应用二(获取xml中键的属性及其值)

Posted xiaoban1423

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射应用二(获取xml中键的属性及其值)相关的知识,希望对你有一定的参考价值。

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

需要解析的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="classname" value="tips"></UIElement>
</Page>

 

分析题目:解析XML完成数据的解析封装,返回Page对象,需先创建Page对象

public class Page {
    private String keyword;
    private List<Locator> uiElements;

    public String getKeyword() {
        return keyword;
    }

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

    public List<Locator> getUiElements() {
        return uiElements;
    }

    public void setUiElements(List<Locator> uiElements) {
        this.uiElements = uiElements;
    }

    public Page() {

    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "keyword:" + this.keyword + " ,UIElement:" + this.uiElements;
    }
}

再根据题意创建UIElement类

public class UIElement {
    private String keyword;
    private String value;
    private String by;

    public String getKeyword() {
        return keyword;
    }

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

    public String getValue() {
        return value;
    }

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

    public String getBy() {
        return by;
    }

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

    public UIElement() {

    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "keyword:" + this.keyword + ", by:" + this.by + ", value:" + this.value;
    }
}

以下列出三种解析方式:

①直接通过属性名进行解析

public class UILibraryDemo {
    public static void main(String[] args) throws Exception {
        String path = "src/test/resources/UILibrary.xml";
        Page page = parseXml(path);
        System.out.println(page.getKeyword());
        List<UIElement> pageList = page.getUiElements();
        for (UIElement pageUi : pageList) {
            System.out.println(pageUi);
        }
    }

    private static Page parseXml(String path) throws Exception {
        // 获取SAXReader解析器
        SAXReader reader = new SAXReader();
        // 读取XML文件
        Document document = reader.read(path);
        // 获取根节点
        Element element = document.getRootElement();

        // 通过属性名获取属性值
        String pageValue = element.attributeValue("keyword");

        // 获取根节点下的子元素
        List<Element> elements = element.elements();

        // 创建一个List对象接收数据
        List<UIElement> elements2 = new ArrayList<UIElement>();

        // 返回page对象
        Page page = new Page();
        page.setKeyword(pageValue);
        page.setUiElements(elements2);

        // 循环遍历子元素,只需要一次,因为只有属性名和值,没有<UIElement>的值
        for (Element uiElement : elements) {
            // 通过属性名获取属性值
            String uiKeyWordValue = uiElement.attributeValue("keyword");
            String uiByValue = uiElement.attributeValue("by");
            String uiValue = uiElement.attributeValue("value");

            // 创建UIElement接收数据
            UIElement theUiElement = new UIElement();
            // 通过set方法将值加入UIElement类中
            theUiElement.setKeyword(uiKeyWordValue);
            theUiElement.setBy(uiByValue);
            theUiElement.setValue(uiValue);
            // 将UIElement对象传入到elements中
            elements2.add(theUiElement);
        }
        return page;

    }
}

②通过反射方法解析XML(只封装了UIElement类)

public class ReflectUiElement {
    public static void main(String[] args) throws Exception {
        String path = "src/test/resources/UILibrary.xml";
        Page page = reflectUi(path);

        System.out.println(page.getKeyword());
        List<UIElement> pageList = page.getUiElements();
        for (UIElement uiList : pageList) {
            System.out.println(uiList);
        }

    }

    private static Page reflectUi(String path) throws Exception {
        // 利用解析器进行解析
        SAXReader reader = new SAXReader();

        // 读取文件
        Document document = reader.read(path);

        // 获取根节点的值
        Element element = document.getRootElement();

        // 不封装Page,只存在一个Page的属性
        String attributeValue = element.attributeValue("keyword");

        // 创建Page对象传入数据
        Page page = new Page();
        // 传入keyword的value值
        page.setKeyword(attributeValue);

        // 获取根节点下的子元素所属性民
        List<Element> uiList = element.elements();

        // 获取UIElement字节码
        Class<UIElement> clazz = UIElement.class;

        // 创建一个uiElement来保存反射出来对象
        List<UIElement> uiElementList = new ArrayList<UIElement>();

        // 将page的setUiElement传值进来
        page.setUiElements(uiElementList);

        // 循环遍历子元素
        for (Element preList : uiList) {
            // 封装每一个UIElement的属性值
            List<Attribute> theUiElements = preList.attributes();
            // 创建字节码对象接受theUiElements的值
            UIElement uiElement = clazz.newInstance();
            // 循环一个UIElement的属性
            for (Attribute oneAttribute : theUiElements) {
                // 通过GetName获取所对应属性的属性名
                String uiName = oneAttribute.getName();
                // 截取第一个字母,并将其转换成大写
                String uiFirst = uiName.substring(0, 1).toUpperCase();
                // 截取剩下的字符串
                String uiRemians = uiName.substring(1);
                // 拼接起来
                String uiElementAttributeName = "set" + uiFirst + uiRemians;

                // 获取属性的值
                String uiElementAttributeValue = oneAttribute.getText();

                // 调用反射方法
                Method method = clazz.getMethod(uiElementAttributeName, String.class);

                method.invoke(uiElement, uiElementAttributeValue);

            }
            // 将字节码对象添加到list集合中
            uiElementList.add(uiElement);
        }
        // 返回Page对象
        return page;
    }
}

③通过反射方法解析XML(封装了Page类和UIElement类:封装Page时千万不要忘记封装UIElement属性,因为这个地方程序曾报错)

public class ReflectPage {

    public static void main(String[] args) throws Exception {
        String path = "src/test/resources/UILibrary.xml";
        Page page = reflectUi(path);

        System.out.println(page.getKeyword());
        List<UIElement> pageList = page.getUiElements();
        for (UIElement uiList : pageList) {
            System.out.println(uiList);
        }
    }

    private static Page reflectUi(String path) throws Exception {
        // 利用解析器进行解析
        SAXReader reader = new SAXReader();

        // 读取文件
        Document document = reader.read(path);

        // 获取根节点的值
        Element element = document.getRootElement();

        // 获取字节码对象
        Class<Page> pageClazz = Page.class;

        // 创建字节码对象
        Page pagez = pageClazz.newInstance();

        // 通过根节点属性名获取属性值
        Attribute attribute = element.attribute(0);

        // 通过attribute属性获取属性名和属性值
        String attributeName = attribute.getName();
        String attributeValue = attribute.getText();

        // 获取到的是Keyword,需要转换成setKeyword
        // 截取第一个字母,并将其转换成大写
        String pageFirst = attributeName.substring(0, 1).toUpperCase();
        // 截取剩下的字符串
        String pageRemians = attributeName.substring(1);
        // 拼接起来
        String pageAttributeName = "set" + pageFirst + pageRemians;

        // 调用反射方法,只反射了keyword,还需要反射UIElement
        Method pageKeyWordMethod = pageClazz.getMethod(pageAttributeName, String.class);
        pageKeyWordMethod.invoke(pagez, attributeValue);

        // 创建Page对象传入数据
        Page page = new Page();

        // 获取根节点下的子元素所属性民
        List<Element> uiList = element.elements();

        // 获取UIElement字节码
        Class<UIElement> clazz = UIElement.class;

        // 创建一个uiElement来保存反射出来对象
        List<UIElement> uiElementList = new ArrayList<UIElement>();

        // 循环遍历子元素
        for (Element preList : uiList) {
            // 封装每一个UIElement的属性值
            List<Attribute> theUiElements = preList.attributes();
            // 创建字节码对象接受theUiElements的值
            UIElement uiElement = clazz.newInstance();
            // 循环一个UIElement的属性
            for (Attribute oneAttribute : theUiElements) {
                // 通过GetName获取所对应属性的属性名
                String uiName = oneAttribute.getName();
                // 截取第一个字母,并将其转换成大写
                String uiFirst = uiName.substring(0, 1).toUpperCase();
                // 截取剩下的字符串
                String uiRemians = uiName.substring(1);
                // 拼接起来
                String uiElementAttributeName = "set" + uiFirst + uiRemians;

                // 获取属性的值
                String uiElementAttributeValue = oneAttribute.getText();

                // 调用反射方法
                Method uiMethod = clazz.getMethod(uiElementAttributeName, String.class);

                uiMethod.invoke(uiElement, uiElementAttributeValue);
            }
            // 将字节码对象添加到list集合中
            uiElementList.add(uiElement);
        }
        // page中的UIElement集合也需要反射
        Method methodUiElement = pageClazz.getMethod("setUiElements", List.class);
        methodUiElement.invoke(page, uiElementList);

        // 返回Page对象
        return page;
    }
}

小白初上路,供个人学习和复习....欢迎讨论..

以上是关于反射应用二(获取xml中键的属性及其值)的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 couchdb 中键的值

如何替换 Python 中键的值?

修改 boost unordered_map 中键的值

更新 Firebase 中键的值

仅允许 Joi 模式中键的特定值

在php中获取多维数组中键的值