XML--读写操作

XML文档的相关操作

1、配置文件:在实际项目开发中,XML作为配置文件是不可取代的(框架中的部分功能可以以注解形式来取代)

  (1) 不同技术,XML配置文件的作用也不一样。

  (2) 比如当前和这个阶段的web.xml,就是用来做Servlet等相关组件配置中心的主配置文件来使用。

 

2、数据传输:数据传输的媒介

  (1) 、例如是A公司将他们的数据用JAva语言创建成XML文件,然后B公司用C#语言对XML文件进行解析,就可以得到A公司的保存在XML文件中的数据了。

  (2) 、我们未来的实际项目开发,前端和后端分工明确,后端(Java)连JDBC,将数据从数据库表中取出,然后将数据传输到前端(HTML),前端显示这些从数据库表中取出的数据。

  (3) 、综上:对于数据传输这方面,未来后端为前端做数据传输是经常用到的,我们使用数据传输的媒介来完成,但是在我们的实际项目开发中,我们有更好的方式来代替XML的形式做数据传输,我们用的是JSON。

 

3、基础语法:

  (1) 文档必须以<?xml开头,必须以?>结尾

  (2) 文档声明必须在文档中的0行0列

  (3) 文档声明的3个属性:

  1. version属性:指定xml文档版本,必须属性,因为我们不会选择1.1,只会选择1.0.
  2. encoding属性:指定当前文档的编码,可选属性,默认是utf-8;
  3. Standalone属性:指定文档独立性。可选属性,默认为yes,表示当前文档是独立文档,如果为no,则是非独立文档,会依赖外部文件。

  (4) 空元素的标签必须要自己闭合,不然整篇xml文档直接报废的。

  (5) 良好的xml文档,必须要有一个根元素  【有且仅有一个】

  (6) 注释: <!--   -->

  (7) 对于一些转义字符,我们要使用对应的替代

  1. <:对应小于号
  2. >:对应大于号
  3. &:对应&
  4. &apos:对应单引号
  5. ":对应双引号

  (8) CDATA区

  1. <![CDATA][xxxxxxxx中间的是我们本来是要用转义字符输出的,写在这里面就不用转义字符,可以直接输出了,不会出现冲突的xxxxxxx]]>

 

4、 xml文档解析:

  (1)、sax解析

  (2)、dom解析

  (3)、dom4j:实际开发中最常用的开发包:

 

5、必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以继续操作了。

 

6、具体的操作步骤

  a.导入jar包

  b.创建一个核心对象 SAXReader     --------new SAXReader(); 

  c.将xml文档加载到内存中形成一棵树  --------------Document doc=reader.read(文件)

  d.获取根节点             ---------------------Element root=doc.getRootElement();

  e.通过根节点就可以获取其他节点(文本节点,属性节点, 元素节点)

    获取所有的子元素 -----------------List<Element> list=root.elements()

  f.element.elementText("id");  来得到子元素中的内容,通过子元素的节点名字来得到。

 

7、还有一个dom4j的扩充方法 xPath,可以直接通过xml文件中的单个标签路径来得到信息。

  事例:

  Element element_childer =  (Element)element_root.selectSingleNode("//body_01//childer_02");

 

下面是一个我用来实验的小示例:

  注意:要导入对应的开发包dom4j和jaxen包

 

  1 import java.io.FileOutputStream;
  2 import java.io.IOException;
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import org.dom4j.Document;
  7 import org.dom4j.DocumentException;
  8 import org.dom4j.DocumentHelper;
  9 import org.dom4j.Element;
 10 import org.dom4j.io.OutputFormat;
 11 import org.dom4j.io.SAXReader;
 12 import org.dom4j.io.XMLWriter;
 13 import org.xml.sax.SAXException;
 14 
 15 /**
 16  * 这个是对xml的读、写进行的操作
 17  * 使用的是dom4j这个jar来进行的操作
 18  * 工具:jaxen-1.1-beta-6.jar  dom4j-1.6.1.jar
 19  * 读的时候使用了两种方法来进行读,具体需求看情况来定
 20  * @author TurtleZhang 
 21  *
 22  */
 23 public class ExerciseXMlDemo {
 24 
 25     public static void main(String[] args) throws IOException, SAXException, DocumentException {
 26         //1----writer
 27         writerXml();
 28 
 29         //2----readere
 30         readerXml_01();
 31 
 32         //3----reader
 33         readerXml_02();
 34         
 35         //3---reader
 36         readerXml_03();
 37     }
 38 
 39     /**
 40      * 模拟往文件中写入xml格式的内容
 41      * 这个是自己创建好xml格式,填好数据,然后写入xml文件中
 42      * @throws IOException 
 43      */
 44     private static void  writerXml() throws IOException {
 45 
 46         //1----创建一个document文档,用来对xml进行操作写入
 47         Document document = DocumentHelper.createDocument();      
 48 
 49         //2-----创建了一个根节点,推荐每个xml文档都有一个root,根节点
 50         Element root = document.addElement("root");
 51 
 52         //3------在root根节点下面创建了一个子节点
 53         Element body_01 =  root.addElement("body_01");
 54 
 55         //4-------在第二层的子节点【元素】上添加所表示的文本信息
 56         for(int i=0;i<5;i++) {
 57             Element childer =  body_01.addElement("childer_0"+i);
 58 
 59             childer.addText(Integer.toString(i));
 60         }
 61 
 62         //3------重复上面的操作
 63         Element body_02 = root.addElement("body_02");
 64 
 65         //4-------重复上面的操作
 66         for(int i=0;i<5;i++) {
 67             Element childer =  body_02.addElement("childer_0"+i);
 68             childer.addText(Integer.toString(i));
 69         }
 70 
 71 
 72         //5---进行文件的写入  ,创建写入文件流
 73 
 74         FileOutputStream fileOutputStream = new FileOutputStream("test_01.xml");
 75 
 76         //6---用一个好看的写入格式
 77         OutputFormat outputFormat=OutputFormat.createPrettyPrint();
 78 
 79         //6---创建,配置用来写入xml文件的xml文件写入流
 80         XMLWriter xmlWriter=new XMLWriter(fileOutputStream,outputFormat);
 81 
 82         //7-----进行xml文件的写入
 83         xmlWriter.write(document);
 84 
 85         //8-----写入完成,将文件进行关闭
 86         xmlWriter.close();
 87 
 88     }
 89 
 90     /**
 91      * 第一种读取方式,也是传统的读取方式,通过循环来进行读取
 92      * @throws SAXException 
 93      * @throws DocumentException 
 94      */
 95     @SuppressWarnings("unchecked")
 96     private static void readerXml_01() throws SAXException, DocumentException {
 97 
 98         //1------创建一个用来读取的核心类
 99         SAXReader saxReader=new SAXReader();
100         
101         //2-------读取到对应的xml文档
102         Document document= saxReader.read("test_01.xml");
103 
104         //3------通过xml文档来读取到根节点
105         Element element_Root= document.getRootElement();
106         System.out.println("根节点是"+element_Root.getName());
107 
108         //4-----通过根节点来得到里面的子节点
109         List<Element> element_Bodys= element_Root.elements();
110 
111         //下面的代码只是单纯的用来读取数据测试,没有任何实际作用的
112         //一般来说是配合xml文档的格式,我们会创建一个与之对应的类来进行数据的读取与保存
113         for(Element element : element_Bodys) {
114             
115             //5----得到节点的名字
116             String body=element.getName();
117             
118             //6----得到节点的值
119             String childer_00=element.elementText("childer_00");
120             String childer_01=element.elementText("childer_01");
121             String childer_02=element.elementText("childer_02");
122             String childer_03=element.elementText("childer_03");
123             String childer_04=element.elementText("childer_04");
124 
125             //7---通过StringBuilder来进行字符串的连接
126             StringBuilder stringBuilder=new StringBuilder();
127 
128             stringBuilder.append("第一个子节点:");
129             stringBuilder.append(body);
130             stringBuilder.append("\t第一个元素值:");
131             stringBuilder.append(childer_00);
132 
133             stringBuilder.append("\t第二个元素值:");
134             stringBuilder.append(childer_01);
135 
136             stringBuilder.append("\t第三个元素值:");
137             stringBuilder.append(childer_02);
138 
139             stringBuilder.append("\t第四个元素值:");
140             stringBuilder.append(childer_03);
141 
142             stringBuilder.append("\t第无个元素值:");
143             stringBuilder.append(childer_04);
144 
145             System.out.println("我们读到的集合中的数据为:"+stringBuilder.toString());
146         }
147     }
148 
149 
150     /**
151      * 小事例
152      * @throws DocumentException 
153      */
154     @SuppressWarnings("unchecked")
155     private static void readerXml_02() throws DocumentException {
156         
157         //1------创建一个用来读取的核心类
158         SAXReader saxReader=new SAXReader();
159         
160         //2-------读取到对应的xml文档
161         Document document= saxReader.read("test_01.xml");
162 
163         //3------通过xml文档来读取到根节点
164         Element element_Root= document.getRootElement();
165         System.out.println("根节点是"+element_Root.getName());
166 
167         //4-----通过根节点来得到里面的子节点
168         List<Element> element_Bodys= element_Root.elements();
169         
170         //将数据保存到Node类中,,也只是做个测试而已,具体的看需求而定    
171         ArrayList<Node> nodes=new  ArrayList<Node>();
172 
173         for(Element e: element_Bodys) {
174             Node node=new Node();
175 
176             node.setChilder_00(Integer.parseInt(e.elementText("childer_00")));
177             node.setChilder_01(Integer.parseInt(e.elementText("childer_01")));
178             node.setChilder_02(Integer.parseInt(e.elementText("childer_02")));
179             node.setChilder_03(Integer.parseInt(e.elementText("childer_03")));
180             node.setChilder_04(Integer.parseInt(e.elementText("childer_04")));
181 
182             nodes.add(node);
183         }        
184         for(Node n : nodes) {
185             System.out.println(n.toString());
186         }
187     }
188 
189     
190     
191     /**
192      * 第二种读取方式,通过对传统的dom4j的循环读取方式的扩充,是使用指定的标签来进行读取
193      * @throws DocumentException 
194      */
195     private static void readerXml_03() throws DocumentException {
196 
197         //1------创建一个用来读取的核心类
198         SAXReader reader=new SAXReader();
199         
200         //2-------读取到对应的xml文档
201         Document document=reader.read("test_01.xml");
202         
203         //3------通过xml文档来读取到根节点
204         Element element_Root= document.getRootElement();
205         
206         //这个时候可以使用扩充功能,就直接使用标签名来进行 元素的取得         selectSingleNode  这个就是单独得到我们指定名字的标签
207         Element element = (Element)element_Root.selectSingleNode("//body_01//childer_02");
208         //输出测试
209         System.out.println("元素名:"+element.getName()+"\t\t元素值为:"+element.getText());
210     }
211 }

 

 

 

 

总结:在我们实际项目开发中

  如果需求为解析出xml中所有的数据,那么我们使用传统的dom4j的形式来完成。

  如果需求为快速的找到xml中的某一个元素,那么我们使用xpath的形式来完成比较容易

 

注意:

  1、xpath的形式是传统dom4j形式的扩充,不能独立存在

  2、xpath的使用必须导入jaxen-1.1-beta-6.jar包才能使用

  3、jaxen-1.1-beta-6.jar包必须依附于传统的dom4j的Jar包才能使用,不能独立存在。

 

综合:XML与JSON的比较

  XML和JSON都可以完成不同系统之间数据交换。

  XML体积较大,解析难度较大,所以在现代开发中通常采用 JSON进行数据交换,因为JSON体积小,解析简单,而XML通常充当系统当中的配置文件

 

转载于:https://www.cnblogs.com/zhh19981104/p/10516173.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值