1.什么是解析xml?
系统最终会从xml中读取数据.读取的过程就是解析.
CRUD => 增删改查 => create read update delete => 解析指的就是读.
2.什么是解析器?
就是用来解析xml的类.
过滤器,拦截器,监听器....都是具备相应功能的java类而已.
3.两个常见的解析xml的思路!.
思想:
DOM:将文档中所有内容都封装成对象.读取时,将所有对象都加载到内存中.在内存中创建一颗dom树(记录对象间的关系).
优点: 方便的进行增删改查.
缺点: 会非常消耗内存.
sax:事件驱动的.与pull解析(安卓)类似.把xml文档的 读取过程,划分出5类事件.我们只要提供遇到每类事件做什么的锦囊即可.
优点:内存占用小.
缺点: 不能进行增删改的操作.
DOM解析是由w3c推荐提出的.
Sax解析是由民间提出的.
DOM:
把所有内容封装成了5类对象.
document
Element
Attribute
Text
Commons
共同的父类
node
NOde的属性:
自身属性:
nodeType
nodeName
nodeValue
导航属性
找子节点的:firstChild lastChild childNodes
找父节点的:parentNode
找兄弟节点:nextSibling previousSibling
获得Element的方式
getElementById ==> Document
getELementsByTagName ==> Document/Element
getELementsByClassName ==> Document/Element
getElementsByName ==> Document
对于增删改的操作:
创建一个元素: document.createElement
添加一个元素: element.appendChild ,element.insertBefore
替换一个元素: element.replaceChild
删除一个元素: element.removeChild
3.JAXP ==> JDK提供的 ==> java api for xml parser
思想在java中的体现是接口.
我们要开发的话需要接口的实现类.
由各大解析器厂商提供实现接口的类.
A a = new AImpl(); // Aimpl2;
A a = new AImpl2();
//—上面的切换实现类的方式,需要该源代码,太过原始—–
A a = JAXP.getXXX();==> 配置文件 ==> 我们通过修改配置文件就可以实现切换实现类.
//反射.泛型.
//——————————————————————————————
DOM4J ==> 框架 ==>
Dom for java
DOM4J
//——————————————————————————————-
DOM4J 整合两种思想.(SAX DOM)的思想.
使用sax的思想做读取xml.
又参照dom的思想,也在内存中创建了一颗对象关系树. 我们在学习的时候,参照之前我们学习的dom树即可.
//使用dom4j如何避免乱码?
//要保证写入的编码和读取的编码一致.
1.写入的编码如何控制?
XMLWriter writer = new XMLWriter(new PrintWriter("src/students_copy.xml","UTF-8"),format);
2.读取的编码如何控制?
<?xml version="1.0" encoding="GBK"?>,其中encoding属性决定了读取时采用什么编码,而encoding属性由format.setEncoding("GBK");控制.
//其实要保证不乱码上面的方法太弱了!
方法: 使用字节流绝对不会出现乱码!如下:
XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"),format);
JAXP
这是配置文件的简单实现
public class BeanFactory {
private static Properties prop = new Properties();
static{
//1.读取配置文件
try {
prop.load(new FileInputStream("src/beanFactory.properties"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static <T> T getBean(Class<T> c){
//1.读取配置文件
try {
//2.取出用哪个实现类
String className = prop.getProperty(c.getSimpleName());
//3.根据完整类名创建实例并返回
Class<T> clazz = (Class<T>) Class.forName(className);
return clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Dom4J解析案例
dom4j是学习的重点,一定要会。
// 读取xml
public class Demo1 {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File("src/students.xml"));
System.out.println(document.asXML());
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 查询出所有学生的所有信息
public class Demo2_2 {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
//1.获得根元素
Element root = document.getRootElement();
//2.迭代根元素下的所有名叫student的子元素
List<Element> list = root.elements("student");
for(Element student : list){
//3.获得student元素的number属性
String number = student.attributeValue("number");
//4.student子元素的内容(name age sex)
String name = student.elementText("name");
String age = student.elementText("age");
String sex = student.elementText("sex");
System.out.println("当前学生的学号是"+number+",姓名是:"+name+",年龄是:"+age+",性别是"+sex+"");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 查询出所有学生的所有信息
public class Demo2 {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
//1.获得根元素
Element root = document.getRootElement();
//2.迭代根元素下的所有名叫student的子元素
for(Iterator<Element> it = root.elementIterator("student");it.hasNext();){
Element student = it.next();
//3.获得student元素的number属性
String number = student.attributeValue("number");
//4.student子元素的内容(name age sex)
String name = student.elementText("name");
String age = student.elementText("age");
String sex = student.elementText("sex");
System.out.println("当前学生的学号是"+number+",姓名是:"+name+",年龄是:"+age+",性别是"+sex+"");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 增加一个学生元素. jack itcast_0003 19 male
public class Demo3 {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File("src/students.xml"));
//1 获得根元素
Element root = document.getRootElement();
//2 添加Element,添加number属性,
Element studentEle = root.addElement("student").addAttribute("number", "itcast_0003");
//3 添加name age sex 子元素并添加子元素中的文本
studentEle.addElement("name").addText("张三");
studentEle.addElement("age").addText("19");
studentEle.addElement("sex").addText("male");
//4 将document对象写到文件中.
//创建格式化器
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//创建写入器
//XMLWriter writer = new XMLWriter(new FileWriter("src/students_copy.xml"),format);
XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"),format);
//写入
writer.write(document);
//关闭资源
writer.close();
// 删除一个学生 itcast_0001
public class Demo4 {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File("src/students.xml"));
//1 获得根元素
Element root = document.getRootElement();
//使用xpath找到我们需要元素
//定义xpath
String xpath = "//student[@number='itcast_0001']";
Element student = (Element) document.selectSingleNode(xpath);
//删除
System.out.println(student.getParent().remove(student));
//回写
XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
//下面这个思路可以.但是效率太低.
//2 获得所有学生元素
//3 遍历
//判断=>number属性是否为要删除的
//是==>删除
//不是
//4 回写
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//修改一个学生 itcast_0001 ==> rose 16 female
public class Demo5 {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File("src/students.xml"));
//1.定义xpath表达式
String xpath ="//student[@number='itcast_0001']";
//2.使用xpath查找
Element studentEle = (Element) document.selectSingleNode(xpath);
//3.修改student元素的子元素的name ,age .sex内容
studentEle.element("name").setText("rose");
studentEle.element("age").setText("16");
studentEle.element("sex").setText("female");
//回写
XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
crud
public class StudentDaoImpl implements StudentDao {
@Override
public void saveStudent(Student stu) {
try {
Document doc = getDocument();
Element root = doc.getRootElement();
// 4.在根元素上添加student子元素,添加属性
Element studentEle = root.addElement("student").addAttribute(
"number", stu.getNumber());
// 5. 在student上添加name,age,sex子元素并添加内容
studentEle.addElement("name").setText(stu.getName());
studentEle.addElement("age").setText(stu.getAge() + "");
studentEle.addElement("sex").setText(stu.getSex());
save2File(doc);
} catch (Exception e) {
e.printStackTrace();
}
}
private void save2File(Document doc) throws UnsupportedEncodingException,
FileNotFoundException, IOException {
// 6.回写
// 1>创建OutputFormat
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
// 2>创建xmlwriter
XMLWriter writer = new XMLWriter(new FileOutputStream(
"src/students_copy.xml"), format);
// 3>写入
writer.write(doc);
// 4>释放资源
writer.close();
}
private Document getDocument() throws DocumentException {
// 1.创建解析器
SAXReader reader = new SAXReader();
// 2.加载xml文件 ==> doc
Document doc = reader.read(new File("src/students_copy.xml"));
// 3.获得根元素
return doc;
}
@Override
public void deleteStudent(String number) {
try {
Document doc = getDocument();
Element root = doc.getRootElement();
Iterator<Element> it = root.elementIterator("student");
while(it.hasNext()){
Element student = it.next();
if (student.attributeValue("number").equals(number)) {
student.getParent().remove(student);
}
}
save2File(doc);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void deleteStudent(Student stu) {
try {
Document doc = getDocument();
Element root = doc.getRootElement();
Iterator<Element> it = root.elementIterator("student");
while(it.hasNext()){
Element student = it.next();
if (student.attributeValue("number").equals(stu.getNumber())) {
student.getParent().remove(student);
}
}
save2File(doc);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void updateStudent(Student stu) {
}
@Override
public Student getStudentByNumber(String number) {
try {
Student students = new Student();
Document doc = getDocument();
Element root = doc.getRootElement();
List<Element> list = root.elements("student");
for(Element student : list){
if(student.attribute("number").getValue().equals(number)){
String name = students.getName();
name=student.elementText("name");
int age = students.getAge();
age =Integer.parseInt( student.element("age").getText());
String sex = students.getSex();
sex = student.element("sex").getText();
String num = students.getNumber();
num = student.attribute("number").getValue();
students.setAge(age);
students.setName(name);
students.setNumber(number);
students.setSex(sex);
return students;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public List<Student> getAllStudent() {
Document doc;
List<Student> li = new ArrayList();
try {
doc = getDocument();
Element root = doc.getRootElement();
List<Element> list = root.elements("student");
for(Element s : list){
Student s1 = new Student();
String name = s.elementText("name");
String sex = s.elementText("sex");
String age = s.elementText("age");
String number = s.attributeValue("number");
s1.setAge(Integer.parseInt(age));
s1.setName(name);
s1.setSex(sex);
s1.setNumber(number);
li.add(s1);
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return li;
}
}