java 写 xml_JAVA对XML文件的读写

XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享。

xml指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

以下为例:

在XML中,所有的处理指令都以结束。<?后面紧跟的是处理指令的名称 。

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。

XML 元素可以在开始标签中包含属性,属性 (Attribute) 提供关于元素的额外(附加)信息。属性通常提供不属于数据组成部分的信息,但是对

需要处理这个元素的应用程序来说却很重要。

XML 属性必须加引号,属性值必须被引号包围,不过单引号和双引号均可使用。

如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体引用。

进入主题了

首先要有一个xml文件为名字为emplist.xml内容如下

1 <?xml version="1.0" encoding="UTF-8"?>

2

3

4 张三

5

6 男

7 5000

8

9

10

XML解析方式

SAX解析方式

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。 其优缺点分别为:

优点: 解析可以立即开始,速度快,没有内存压力

缺点: 不能对节点做修改

DOM解析方式

DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中

的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。其优缺点分别为:

优点:把xml文件在内存中构造树形结构,可以遍历和修改节点

缺点: 如果文件比较大,内存有压力,解析的时间会比较长

SAXReader读取XML文档

使用SAXReader需要导入dom4j-full.jar包。其是DOM4J的一个核心API,用于读取XML文档。

DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强

大和极端易用使用的特点,同时它也是一个开放源代码的软件。

1 packageday12;2

3 importjava.io.File;4 importjava.util.ArrayList;5 importjava.util.List;6

7 importorg.dom4j.Attribute;8 importorg.dom4j.Document;9 importorg.dom4j.Element;10 importorg.dom4j.io.SAXReader;11

12 /**

13 * 使用DOM解析xml文档14 *@authorylg15 *16 */

17 public classParseXmlDemo {18 public static voidmain(String[] args) {19 try{20 /*

21 * 解析XML大致流程22 * 1:创建SAXReader23 * 2:使用SAXReader读取数据源(xml文档信息)24 * 并生成一个Document对象,该对象即表示25 * xml文档内容。DOM耗时耗内存资源也是在26 * 这一步体现的。因为会对整个XML文档进行27 * 读取并载入内存。28 * 3:通过Document对象获取根元素29 * 4:根据XML文档结构从根元素开始逐层获取30 * 子元素最终以达到遍历XML文档内容的目的31 *32 */

33 //1

34 SAXReader reader = newSAXReader();35

36 //2

37 Document doc38 = reader.read(new File("emplist.xml"));39

40 /*

41 * 342 * Document提供了方法:43 * Element getRootElement()44 * 该方法是用来获取XML文档中的根元素,45 * 对于emplist.xml文档而言,根元素就是46 * 标签。47 *48 * Element类49 * 每一个Element实例都可以表示XML文档中的50 * 一个元素,即:一对标签。51 */

52 Element root =doc.getRootElement();53 /*

54 * Element提供了方法:55 * String getName()56 * 该方法可以获取当前元素的名字(标签名)57 */

58 System.out.println(59 "获取了根元素:"+root.getName()60 );61 //4

62 /*

63 * 获取一个元素中的子元素64 * Element提供了相关方法:65 *66 * 167 * Element element(String name)68 * 获取当前元素下指定名字的子元素。69 *70 * 2:71 * List elements()72 * 获取当前元素下所有子元素73 *74 * 3:75 * List elements(String name)76 * 获取当前元素下所有同名子元素77 *78 * 2,3返回的集合中的每一个元素都是Element79 * 的实例,每个实例表示其中的一个子元素。80 *81 */

82 //获取所有emp标签

83 List list =root.elements();84

85 //用于保存所有员工信息的List集合

86 List empList = new ArrayList();87

88 for(Element empEle : list){89 //System.out.println(empEle.getName());90 //获取员工名字

91 Element nameEle = empEle.element("name");92 /*

93 * Element还提供了获取当前元素中文本的方法:94 * String getText(),String getTextTrim()95 */

96 String name =nameEle.getText();97 System.out.println("name:"+name);98

99 //获取员工年龄

100 int age =Integer.parseInt(101 empEle.elementText("age")102 );103

104 //获取性别

105 String gender = empEle.elementText("gender");106

107 //获取工资

108 int salary =Integer.parseInt(109 empEle.elementText("salary")110 );111 /*

112 * Attribute attribute(String name)113 * 获取当前元素(标签)中指定名字的属性114 *115 * Attribute的每一个实例用于表示一个116 * 属性。其中常用方法:117 * String getName():获取属性名118 * String getValue():获取属性值119 */

120 Attribute attr121 = empEle.attribute("id");122 int id =Integer.parseInt(123 attr.getValue()124 );125

126 Emp emp = newEmp(id,name,age,gender,salary);127 empList.add(emp);128 }129 System.out.println("解析完毕!");130 for(Emp emp : empList){131 System.out.println(emp);132 }133

134

135 } catch(Exception e) {136 e.printStackTrace();137 }138 }139 }

写XML

构建Document对象

使用DOM4J我们还可以通过自行构建Document对象,并组建树状结构来描述一个XML文档,并使用DOM4J将其写入一个文件。

1 importjava.io.FileOutputStream;2 importjava.util.ArrayList;3 importjava.util.List;4

5 importorg.dom4j.Document;6 importorg.dom4j.DocumentHelper;7 importorg.dom4j.Element;8 importorg.dom4j.io.OutputFormat;9 importorg.dom4j.io.XMLWriter;10

11 /**

12 * 使用DOM生成XML文档13 *@authorylg14 *15 */

16 public classWriteXmlDemo {17 public static voidmain(String[] args) {18 List list = new ArrayList();19 list.add(new Emp(1,"张三",25,"男",5000));20 list.add(new Emp(2,"李四",26,"女",6000));21 list.add(new Emp(3,"王五",27,"男",7000));22 list.add(new Emp(4,"赵六",28,"女",8000));23 list.add(new Emp(5,"钱七",29,"男",9000));24 /*

25 * 使用DOM生成XML文档的大致步骤:26 * 1:创建一个Document对象表示一个空文档27 * 2:向Document中添加根元素28 * 3:按照文档应有的结构从根元素开始顺序添加29 * 子元素来形成该文档结构。30 * 4:创建XmlWriter对象31 * 5:将Document对象写出32 * 若写入到文件中则形成一个xml文件33 * 也可以写出到网络中作为传输数据使用34 */

35

36 //1

37 Document doc38 =DocumentHelper.createDocument();39

40 /*

41 * 242 * Document提供了添加根元素的方法:43 * Element addElement(String name)44 * 向当前文档中添加指定名字的根元素,返回45 * 的Element就表示这个根元素。46 * 需要注意,该方法只能调用一次,因为一个47 * 文档只能有一个根元素。48 */

49 Element root = doc.addElement("list");50

51 //3

52 for(Emp emp : list){53 /*

54 * Element也提供了追加子元素的方法:55 * Element addElement(String name)56 * 调用次数没有限制,元素可以包含若干57 * 子元素。58 */

59 Element empEle = root.addElement("emp");60

61 //添加name信息

62 Element nameEle = empEle.addElement("name");63 nameEle.addText(emp.getName());64

65 //添加age信息

66 Element ageEle = empEle.addElement("age");67 ageEle.addText(emp.getAge()+"");68

69 //添加gender信息

70 Element genderEle = empEle.addElement("gender");71 genderEle.addText(emp.getGender());72

73 //添加salary信息

74 Element salEle = empEle.addElement("salary");75 salEle.addText(emp.getSalary()+"");76

77 /*

78 * 向当前元素中添加指定名字以及对应值的属性79 */

80 empEle.addAttribute("id", emp.getId()+"");81

82 }83 try{84 //4

85 XMLWriter writer = newXMLWriter(OutputFormat.createPrettyPrint());86 FileOutputStream fos87 = new FileOutputStream("myemp.xml");88 writer.setOutputStream(fos);89

90 //5

91 writer.write(doc);92 System.out.println("写出完毕!");93 writer.close();94 }catch(Exception e){95 e.printStackTrace();96 }97 }98 }

注意事项:

XPath 路径表达式

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。由于我们单纯使用dom定位节点时,大部

分时间需要一层一层的处理,如果有了xPath,我们定位我们的节点将变得很轻松。他可以根据路径,属性,甚至是条件进行节点的检索。

XPath 使用路径表达式在XML 文档中进行导航

XPath 包含一个标准函数库

XPath 是 XSLT 中的主要元素

XPath 是一个 W3C 标准

路径表达式语法:

斜杠(/)作为路径内部的分割符。

同一个节点有绝对路径和相对路径两种写法:

路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...。

相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step, 也就是不使用"/"起首。

"."表示当前节点。

".."表示当前节点的父节点

nodename(节点名称):表示选择该节点的所有子节点

"/":表示选择根节点

"//":表示选择任意位置的某个节点

"@": 表示选择某个属性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值