生成xml_Java操作XML
Java中有两种解析XML文件的方式:DOM解析和SAX解析。
一、使用DOM4j进行XML的DOM解析
DOM解析是一次性将整个XML文档加载进内存,在内存中构建Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到XML文档的内容。
通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)。
1.1、使用DOM4j查询XML文档
XML文档在DOM解析中可以被映射为多种节点,其中比较重要和常见的是元素节点(Element)、属性节点(Attribute)和文本节点(Text)。
查询节点主要可以使用以下方法:
- Document new SAXReader().read(File file) —— 读取XML文档
- Element Document.getRootElement() —— 获取XML文档的根元素节点
- Iterator Element.nodeIterator() —— 获取当前元素节点下的所有子节点
- Iterator<Element> Element.elementIterator(元素名) —— 指定名称的所有子元素节点
- Iterator<Attribute> Element.attributeIterator() —— 获取所有子属性节点
- List<Element> Element.elements() —— 获取所有子元素节点
- List<Attribute> Element.attributes() —— 获取所有子属性字节
- Element Element.element(元素名) —— 指定名称的第一个子元素节点
- Attribute Element.attribute(属性名) —— 获取指定名称的子属性节点
- String Element.attributeValue(属性名) —— 获取指定名称的子属性的属性值
- String Attribute.getName() —— 获取属性名称
- String Attribute.getValue() —— 获取属性值
- String Element.getText() —— 获取当前元素节点的子文本节点
- String Element.elementText(元素名) —— 获取当前元素节点的指定名称的子文本节点
示例:在eclipse中读取以下students.xml文档的内容,并打印至控制台
<?xml version="1.0" encoding="UTF-8"?><Students><Student id="001"><name>张三</name><age>19</age><gender>男</gender><grade>计算机1班</grade></Student><Student id="002"><name>李四</name><age>20</age><gender>男</gender><grade>计算机2班</grade></Student>
</Students>
import java.io.File;
import java.util.List;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class ReadAndPrintXML {public static void main(String[] args) throws Exception {// 创建一个XML解析器对象SAXReader reader = new SAXReader();// 读取XML文档,返回Document对象Document document = reader.read(new File("E:xmlstudents.xml"));// 获取根元素节点Element root = document.getRootElement();StringBuilder sb = new StringBuilder();recursion(root, sb);System.out.println(sb.toString());}private static void recursion(Element ele, StringBuilder sb) {sb.append("<");// 解析元素节点sb.append(ele.getName());// 解析属性节点List<Attribute> attributes = ele.attributes();for(Attribute attribute : attributes) {sb.append(" ");sb.append(attribute.getName());sb.append("=");sb.append(attribute.getValue());}sb.append(">");// 解析文本节点sb.append(ele.getText());// 递归解析元素节点List<Element> elements = ele.elements();for(Element element : elements) {recursion(element, sb);}sb.append("<" + ele.getName() + "/>n");}}
1.2、使用DOM4j修改XML文档
①写出内容到xml文档
XMLWriter writer = new XMLWriter(OutputStream out, OutputFormat format)
writer.write(Document doc)
上面的OutputFormat对象可以由OutputFormat类的两个静态方法来生成:
- createPrettyPrint() —— 生成的OutputFormat对象,使写出的XML文档整齐排列,适合开发环境使用
- createCompactFormat() —— 生成的OutputFormat对象,使写出的XML文档紧凑排列,适合生产环境使用
②生成文档或增加节点
- Document DocumentHelper.createDocument() —— 生成一个新的XMLDocument对象
- Element Element.addElement(元素节点名) —— 增加一个子元素节点
- Attribute Element.addAttribute(属性名,属性值) —— 增加一个子属性节点
③修改节点
- Attribute.setValue(属性值) —— 修改属性节点值
- Attribute Element.addAttribute(同名属性名,属性值) —— 修改同名的属性节点值
- Element.setText(内容) —— 修改文本节点内容
④删除节点
- Element.detach() —— 删除元素节点
- Attribute.detach() —— 删除属性节点
示例:生成一个和前面的students.xml一样的XML文档,并写入到磁盘
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;public class WriteXML {public static void main(String[] args) throws Exception {// 创建一个XMLWriter对象OutputFormat format = OutputFormat.createPrettyPrint();XMLWriter writer = new XMLWriter(new FileOutputStream("E:xmlstudents2.xml"), format);// 生成一个新的Document对象Document doc = DocumentHelper.createDocument();// 增加Students元素节点Element students = doc.addElement("Students");// 增加两个Student元素节点Element student1 = students.addElement("student");Element student2 = students.addElement("student");// 为两个Student元素节点分别增加id属性节点student1.addAttribute("id", "001");student2.addAttribute("id", "002");// 分别增加name, age, gender, grade元素子节点student1.addElement("name").setText("张三");student1.addElement("age").setText("19");student1.addElement("gender").setText("男");student1.addElement("grade").setText("计算机1班");student2.addElement("name").setText("李四");student2.addElement("age").setText("20");student2.addElement("gender").setText("男");student2.addElement("grade").setText("计算机2班");// 将Document对象写入磁盘writer.write(doc);writer.close();}
}
1.3、使用xPath技术
使用dom4j查询比较深的层次结构的节点时,比较麻烦,因此可以使用xPath技术快速获取所需的节点对象。
首先也需要在eclipse中导入xPath的jar包,我这里使用的是jaxen-1.1-beta-6.jar
①使用xPath的方法
- List<Node> Document.selectNodes(xpath表达式) —— 查询多个节点对象
- Node Document.selectSingleNode(xpath表达式) —— 查询一个节点对象
②xPath表达式语法
- / —— 绝对路径,表示从xml文档的根位置开始
- // —— 相对路径,表示不分任何层次结构的选择元素
- * —— 表示匹配所有元素
- [] —— 条件,表示选择符合条件的元素
- @ —— 属性,表示选择属性节点
- and —— 关系,表示条件的与关系
- text() —— 文本,表示选择文本内容
示例:
import java.io.File;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;public class XPathTest {public static void main(String[] args) throws Exception {SAXReader reader = new SAXReader();Document doc = reader.read(new File("E:xmlstudents.xml"));// 选择所有的student元素List<Node> list = doc.selectNodes("//Student");// 选择文本内容是"张三"的name元素Element name = (Element) doc.selectSingleNode("//name[text()='张三']");// 选择所有id属性节点List<Node> list2 = doc.selectNodes("//@id");// 选择id属性为002的student元素Element student = (Element) doc.selectSingleNode("//Student[@id='002']");// 选择根元素节点的所有子节点Element root = doc.getRootElement();List<Node> list3 = doc.selectNodes("/Students/*");}
}
二、使用SAX方式解析XML文档
SAX方式解析的原理是:在内存中加载一点,读取一点,处理一点。对内存要求比较低。
JDK内置了SAX解析工具,存放在org.xml.sax包中。
2.1、使用SAX解析方式查询XML文档
核心的API类:
1、SAXParser.parse(File f, DefaultHandler dh)方法:解析XML文件
参数一File:表示读取的XMl文件
参数二DefaultHandler:SAX事件处理程序,包含SAX解析的主要逻辑。开发人员需要写一个DefaultHandler的子类,然后将其对象作为参数传入parse()方法。
2、 SAXParserFactory类,用于创建SAXParser对象,创建方式如下:
SAXParser parse = SAXParserFactory.newInstance().newSAXParser();
3、DefaultHandler类的主要方法:
- void startDocument() —— 在读到文档开始时调用
- void endDocument() —— 在读到文档结束时调用
- void startElement(String uri, String localName, String qName, Attributes attributes) —— 读到开始标签时调用
- void endElement(String uri, String localName, String qName) —— 读到结束标签时调用
- characters(char[] ch, int start int length) —— 读到文本内容时调用
示例:使用SAX解析方式读取上面students.xml的内容,并打印至控制台。
import java.io.File;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class SAXTest {public static void main(String[] args) throws Exception {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();parser.parse(new File("E:xmlstudents.xml"), new MyDefaultHandler());}
}class MyDefaultHandler extends DefaultHandler{@Overridepublic void startDocument() throws SAXException {System.out.println("----文档开始解析-------");}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {System.out.print("<" + qName);for(int i = 0; i < attributes.getLength(); i++) {System.out.print(" " + attributes.getQName(i) + "=" + attributes.getValue(i));}System.out.print(">");}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {System.out.print(new String(ch, start, length));}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.print("</" + qName + ">");}@Overridepublic void endDocument() throws SAXException {System.out.println("n----文档开始解析结束-----");}
}
2.2、对比DOM解析和SAX解析
生成xml_Java操作XML相关推荐
- 在C#.net中如何操作XML
在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...
- ActionScript 3操作XML 详解
AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制.这使得程序员在程序中无缝地操作XML.在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析. ...
- c#操作xml实例 2009-03-13 20:00
在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...
- 利用opencv中的类FileStorage生成和读取XML和YAML文件
有时候程序中的变量值.字符串.数组等数据也需要独立于源代码本身保存,这个时候就需要用到XML和YAML文件进行保存. OpenCV4提供了用于生成和读取XML文件和YAML文件的类FileStorag ...
- Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件
建立好数据库后,点击一个键,代码就生成了,这实在是份十分惬意的事情,前面有介绍Hibernate Tools就可以生成代码,那么我们怎么利用它来生成代码呢. 下面就把详细步骤贴出来,同样,有图有真相. ...
- python 中使用ElementTree操作XML
概述 对比其他 Python 处理 XML 的方案,xml.etree.ElementTree 模块(下文我们以 ET 来表示)相对来说比较简单,接口也较友好. 官方文档 里面对 ET 模块进行了较为 ...
- python批量生成,用python批量生成简单的xml文档
最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...
- VC操作XML编程实例
XML编程实例 文章正文 前段时间,由于工作的需要,利用到了XML,所以对其进行了一些简单的研究.在此愿把一些心得写出来,与各位分享,不对的地方还望多多包涵. 1.什么是 XML? 首先,我想各位应该 ...
- 写了一个操作XML文件的类
一个操作XML文件的类..部份功能在完善中~~~~ using System; using System.Collections.Generic; using System.Text; using S ...
最新文章
- 漫画:据说很多搞软件的羡慕硬件工程师
- Error running query: MetaException(message:Got exception: java.net.ConnectException Call From XXXX
- Oracle 自己主动诊断资料档案库 (ADR)、自己主动诊断工作流、ADRCI工具
- 机器学习(十六)——隐式狄利克雷划分
- 果汁飞溅海报还不会玩?先从临摹学习PSD分层模板开始
- Nginx学习总结(14)——Nginx配置参数详细说明与整理
- jmap查询JVM堆内存
- 万字长文!用文本挖掘深度剖析54万首诗歌
- 应用wps对证件照进行更改颜色,更换只需三步。
- Win11怎么进行屏幕休眠时间的设置
- 正则表达式 /^[0-9]+$/
- Redis的复制(Master/Slaver)
- java 循环详解_Java for循环详解
- Ubuntu20.04突然丢失网络时恢复的办法
- 怎样将PDF转成EXCEL
- 虚幻4引擎源码学习笔记(一):整体文件结构
- 向上累积频数怎么算_累计频数怎么求(怎样计算频数和频率)
- 单片机入门学习笔记6:新唐单片机N76E003
- 应用机器学习 Applied Machine Learning (AML) ppt2
- vue 网格组件_简单的Vue组件可显示带有事件的月网格日历