当前位置: 代码迷 >> 综合 >> SE02 Unit07 XML语法 、 XML解析
  详细解决方案

SE02 Unit07 XML语法 、 XML解析

热度:58   发布时间:2023-12-11 15:08:19.0

emplist.xml

<?xml version="1.0" encoding="UTF-8"?>
<list><emp id="1"><name>张三</name><age>34</age><gender></gender><salary>3000</salary></emp><emp id="2"><name>李四</name><age>21</age><gender></gender><salary>4000</salary></emp><emp id="3"><name>王五</name><age>46</age><gender></gender><salary>6500</salary></emp><emp id="4"><name>赵六</name><age>28</age><gender></gender><salary>4400</salary></emp><emp id="5"><name>钱七</name><age>53</age><gender></gender><salary>12000</salary></emp>
</list>

myemp.xml

<?xml version="1.0" encoding="UTF-8"?><list><emp id="1"><name>张三</name><age>22</age><gender></gender><salary>5000</salary></emp><emp id="2"><name>李四</name><age>23</age><gender></gender><salary>6000</salary></emp><emp id="3"><name>王五</name><age>24</age><gender></gender><salary>7000</salary></emp><emp id="4"><name>赵六</name><age>25</age><gender></gender><salary>8000</salary></emp><emp id="5"><name>钱七</name><age>26</age><gender></gender><salary>9000</salary></emp>
</list>

用当前类的实例保存xml文档中的一个员工信息 (这个是用构造方法生成的)

package day12;
/*** 用当前类的实例保存xml文档中的一个员工信息* @author adminitartor**/
public class Emp {
    private int id;private String name;private int age;private String gender;private int salary;public Emp(){}public Emp(int id, String name, int age, String gender, int salary) {super();this.id = id;this.name = name;this.age = age;this.gender = gender;this.salary = salary;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public String toString(){return id + "," + name + "," +age + "," + gender + "," +salary;}
}

使用DOM4J解析XML文档

package day12;import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/*** 使用DOM4J解析XML文档* * 将emplist.xml文档中的所有员工信息解析出来* 并存入到一个List集合保存* @author adminitartor**/
public class ParseXmlDemo {
    public static void main(String[] args) {/** 使用DOM4J解析XML的大致流程* 1:创建SAXReader* 2:使用SAXReader读取XML文档,并返回* 一个Document对象。* 这一步就是DOM解析XML耗时耗资源的地方* 因为这一步就会将XML文档中所有内容解析* 出来并以一个Document对象保存。由于对象* 存于内存,所以文档内容大的话会相应消耗* 资源。* 3:从Document中获取根元素* 4:根据XML文档结构从根元素中逐级获取子元* 素,最终达到遍历XML文档数据的目的。 */try {//1SAXReader reader = new SAXReader();//2读取xml文档并返回Document对象
// reader.read(new File("emplist.xml"));Document doc = reader.read(new FileInputStream("emplist.xml"));System.out.println("读取xml文档完毕!");/** 3 获取根元素* Element的每一个实例用于表示XML文档* 中的一个元素(一对标签)* * Element用于获取当前标签信息的相关方法:* * String getName()* 获取当前标签的名字* * String getText()* 获取当前标签中间的文本信息* * List elements()* 获取当前标签下的所有子标签* * List elements(String name)* 获取当前标签下所有同名子标签* * Element element(String name)* 获取当前标签下指定名字的子标签* * String elementText(String name)* 获取当前标签下指定名字的子标签中间的* 文本。* ele.elementText(name)* 相当于调用了:* ele.element(name).getText()* * Attribute attribute(String name)* 获取当前标签下指定名字的属性* */Element root = doc.getRootElement();/** 该集合用于保存从xml文档中解析出来的* 所有员工信息*/List<Emp> empList = new ArrayList<Emp>();//获取根标签<list>下面的所有子标签<emp>List<Element> list = root.elements();/** 遍历每一个员工标签<emp>,并将信息保存* 到一个Emp对象上,然后存入empList集合*/for(Element empEle : list){//获取nameElement nameEle = empEle.element("name");String name = nameEle.getText();
// System.out.println(name);//获取ageint age = Integer.parseInt(empEle.elementText("age"));//genderString gender = empEle.elementText("gender");//salaryint salary = Integer.parseInt(empEle.elementText("salary")    );/** Attribute的每一个实例用于表示某个标签* 中的一个属性。* 常用方法:* String getName()* 获取属性名* * String getValue()* 获取属性值*/Attribute attri = empEle.attribute("id");int id = Integer.parseInt(attri.getValue());Emp emp = new Emp(id, name, age, gender, salary);empList.add(emp);}System.out.println("解析完毕!");for(Emp emp : empList){System.out.println(emp);}} catch (Exception e) {e.printStackTrace();}      }
}

使用DOM4J生成XML文档

package day12;import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;/*** 使用DOM4J生成XML文档* @author adminitartor**/
public class WriteXmlDemo {public static void main(String[] args) {/** 生成XML文档的大致步骤:* 1:创建一个Document对象表示一个空白* 文档* 2:向Document中添加根元素* 3:按照想生成的xml文档的结构顺序逐级的* 向根元素中添加子元素以及对应的信息* 4:创建XmlWriter对象* 5:将Document对象写出以形成xml文档* 6:关闭XmlWriter */try {List<Emp> empList = new ArrayList<Emp>();empList.add(new Emp(1,"张三",22,"男",5000));empList.add(new Emp(2,"李四",23,"女",6000));empList.add(new Emp(3,"王五",24,"男",7000));empList.add(new Emp(4,"赵六",25,"女",8000));empList.add(new Emp(5,"钱七",26,"男",9000));//1 创建一个空白文档Document doc = DocumentHelper.createDocument();/** 2 向文档中添加根元素* Element addElement(String name)* 添加给定名字的根元素,并将该元素以Element* 实例形式返回,以便于继续操作。* * 注意,该方法只能调用一次,因为一个文档只能有* 一个根元素* */Element root = doc.addElement("list");/** 3 添加子标签以形成xml文档结构* 将集合中的每个员工信息作为一个<emp>标签* 添加到根标签中*/for(Emp emp : empList){/** Element提供了添加相应信息的方法:* * Element addElement(String name)* 向当前标签中添加给定名字的子标签并将其* 返回。*/Element empEle = root.addElement("emp");//向<emp>标签中添加<name>标签Element nameEle = empEle.addElement("name");//向<name>标签中添加文本信息nameEle.addText(emp.getName());empEle.addElement("age").addText(emp.getAge()+"");empEle.addElement("gender").addText(emp.getGender());empEle.addElement("salary").addText(emp.getSalary()+"");/** 向<emp>标签中添加属性"id"*/empEle.addAttribute("id", emp.getId()+""); }//4XMLWriter writer = new XMLWriter(new FileOutputStream("myemp.xml"),OutputFormat.createPrettyPrint());writer.write(doc);System.out.println("写出完毕!");writer.close();} catch (Exception e) {e.printStackTrace();}}
}

使用XPath检索XML数据

package day12;import java.io.File;
import java.util.List;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/*** 使用XPath检索XML数据* @author adminitartor**/
public class XpathDemo {
    public static void main(String[] args) {try {SAXReader reader = new SAXReader();Document doc = reader.read(new File("myemp.xml"));String path = "/list/emp[gender='女' and age>24]/salary";List<Element> list = doc.selectNodes(path);for(Element e : list){System.out.println(e.getText());}} catch (Exception e) {e.printStackTrace();}}
}