反射应用二(获取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中键的属性及其值)的主要内容,如果未能解决你的问题,请参考以下文章