代码改变世界

xml解析

2019-03-12 19:08  缩酒  阅读(342)  评论(0编辑  收藏  举报

 

首先大家要知道XML有约束,约束的两种方式分别是dtdschema;

约束的好处:可以去规范我们的xml标签(根据自己的要求)可以在工具上有相应的提示;

 DOM模型

 

①对与DOM来说 ,一切都是节点Node;

 

Document可以看成一个节点,Element可以看成一个节点,Text可以看成一个节点,

 

   封装出来的对象都可以看成节点Node;

 

③在JDK中,NodeDoucument(文档),Element(标签元素),Text(文本对象), Attr(属性对象)的父接口;

 

原生API解析XML

 

 

d

 

 Dom4j引入

 

我们已经使用原生的APIJDK提供的,是属于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")