首先大家要知道XML有约束,约束的两种方式分别是dtd与schema;
约束的好处:可以去规范我们的xml标签(根据自己的要求),可以在工具上有相应的提示;
DOM模型
①对与DOM来说 ,一切都是节点Node;
②Document可以看成一个节点,Element可以看成一个节点,Text可以看成一个节点,
封装出来的对象都可以看成节点Node;
③在JDK中,Node是Doucument(文档),Element(标签元素),Text(文本对象), Attr(属性对象)的父接口;
原生API解析XML
d
Dom4j引入
我们已经使用原生的API,JDK提供的,是属于w3c 里面知识去解析XML,但是我们完成的代码还不够简单,比如在添加的时候,比较麻烦; 但是可以直接拿到里面很深的标签; 为什么可以拿到?
由于原生解析 ,一次把XML里面的所有内容全部解析完,所有这些对象,都已经存在内存里面;所有可以拿到,但是这样存在什么问题?
第一次就会把内容全解析,非常浪费内存,解析也浪费时间
原生API有自己的问题,原生API的解析方法还不够灵活简单,应该对应解析XML这种非常常用的功能,有很多人做了一些工具(jar包)(别人写了代码,来增强解析我们解析XML的能力)---
其中一个非常出名的一个解析工具 叫做dom4j ---》dom for java
拿到一个节点的文本
需求:取出第二个联系人的名字
分析:①先得到根(contacts) -- doc.getRootElement();
②在根下面的某一个节点 -- root.elements(“linkman”)
③确定拿到某个linkman.elementText(“name”)
element 和elements方法区别:
如果能够确定需要拿到的这个元素(当前这个元素linkman)只有一个,那么可以直接使用element,它就把唯一的一个返回给我们
修改一个元素
需求:把第一个联系人的邮箱改掉
需要同步:把内存的文档 同步到 硬盘上的xml中
同步代码: 把doc写到xml里面
//创建一个xml输出流
FileWriter out = new FileWriter(file);
//把doc(内存)写入到 xml输出流
doc.write(out);
//关闭流资源
out.close();
添加linkman元素
需求:增加一个联系人
添加元素:-- root.addElement(“标签名称”)
设置值:--linkman.addElement(“name”).setText(“张三”);
设置/获取联系人的id属性
设置/获取联系人的id属性
获取联系人id属性值: linkman.attributeValue(“id”)
设置联系人id属性值: linkman.addAttribute(“id”,”999”)
删除一个指定元素
删除第三个联系人信息
linkman.getParent().remove(linkman)
先去找到父节点,在根据父节点删除指定子节点;
4.使用原生API操作XML文件(掌握)分析:①获取document对象(先从DocumentBuilderFactory-->DocumentBuilder--》Document)②通过document获取根元素document.getDocumentElement();③通过根去获取指定的元素root.getElementsByTagName("linkman")④可以获取linkman元素里面的一些值linkman.getElementsByTagName("name").item(0)⑤获取name里面的值name.getTextContent() |
5.使用DOM4J操作XML文件(掌握)①获取document对象SAXReader reader = new SAXReader();File f = new File("G:\20170220JAVA精英班\workspace\day05_xml\src\schema\contacts.xml");Document doc = reader.read(f);②获取根元素Element root = doc.getRootElement()③List elements = root.elements("linkman");④获取name的元素Element name = linkman.element("name");⑤获取name的具体值linkman.elementText("name") |