java xml 文件解析
- 软件开发
- 2022-07-25
- 14热度
- 0评论
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、
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;
}
}