JAVA对xml文件的操作
来源:互联网 发布:手机如何关注淘宝达人 编辑:程序博客网 时间:2024/06/04 00:06
JAVA对xml进行解析和创建主要有四种方法:DOM、SAX、JDOM、DOM4J。其中,DOM和SAX是官方提供的两种解析方法,DOM是与平台无关的官方解析方式,SM是基于事件驱动的解析方式。而JDOM和DOM4J是在这两种基础方法上扩建出来的,只能在JAVA平台中使用的解析方法。
一、DOM
1、概述
DOM解析xml,是一次性将xml文件中的所有内容全部导入到内存中,形成一颗倒树,再在内存中对其进行操作,对于内存的要求较高。
优点:形成了树结构,直观好理解,代码更容易编写。解析过程中,树结构保留在内存中,方便修改。
缺点:当xml文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出。
2、解析实现
准备步骤:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse(xml文件地址);
Document接口提供的方法:
NodeList getElementById(String elementId)返回具有带给定值的ID属性的E了门头。如果不存在此类元素,则此方法返回null。如果一个以上的元素具有带该值的ID属性,返回哪一个元素是不确定的。
NodeList getElementByTagName(String tagname)按文档顺序返回包含在文档中且具有给定标记名称的所有Element的NodeList。
String getInputEncoding()指定解析时此文档使用的编码的属性。如果此属性位置(如在内存中创建Document时),则为null。
String getXmlEncoding()作为xml声明的一部分,指定此文档编码的属性。在未指定或未知时,如在内存中创建Document时,此属性为null。
boolean getXmlStandalone()作为xml声明的一部分,指定此文档是否为独立文档的属性。未指定时,此属性为false。
NodeLsit接口提供的方法:
Node item(int index)返回集合中的第index个项。如果index大于或等于此列表中的节点数,则返回null。
int getLength()列表中的节点数。有效子节点索引的范围是0到Length-1(包含此值)。
Node接口提供的方法:
String getNodeName()此节点的名称,取决于其类型。
String getNodeValue()throws DOMException此节点的值,取决于其类型。
short getNodeType()表示基础对象的类型的节点。
Node getParentNode()此节点的父节点。
NodeList getChildNodes()包含此节点的所有子节点的NodeList。如果不存在子节点,则这是不包含节点的NodeList。
Node getFirstChild()此节点的第一个子节点。如果没有这样的节点,则返回null。
Node getLastChild()此节点的最后一个节点。如果没有这样的节点,则返回null。
NamedNodeMap getAttributes()包含此节点的属性的NamedNodeMap。
Node appendChild(Node newChild)throws DOMException将节点newChild添加到此节点的子节点列表的末尾。如果newChild已经存在于树中,则首先移除它。
String getTextContent()throws DOMException返回此节点及其后代的文本内容。
NamedNodeMap接口返回的都为Node类型。
获取节点属性:
一、未知节点属性的个数和属性名时:
1、Document接口的.getElementsByTagName(标签名)方法,可通过标签名返回节点的集合(返回NodeList类型)
(对于NodeList,得到的是具有相同标签名的节点的集合List,需要用for遍历。)
2、NodeList接口的.getLength() 可返回集合的长度。
3、NodeList接口的.item(int index) 可访问集合中下标为index的节点(index从0开始),(返回Node类型)。
4、Node接口的.getAttributes() 返回节点Node的所有属性的集合(返回NamedNodeMap类型)。
5、NamedNodeMap接口的.getLength() 可返回节点具有的属性的数目。
6、NamedNodeMap接口的.item(int index) 可获取节点下索引值为index的属性,返回Node类型。
7、NamedNodeMap接口的.getNodeName()可返回该属性的名称,通过.getNodeValue()返回属性值。
二、已知节点的属性只有一个,且属性名已知
1、Document接口的.getElementsByTagName(标签名)方法,可通过标签名返回节点的集合(返回NodeList类型)
2、NodeList接口的.getLength() 可返回集合的长度。
3、NodeList接口的.item(int index)强制类型转换为Element类型。
4、Element接口的.getAttribute(属性名) 可得到属性的值。(返回String类型)
获取子节点及子节点的文本内容:
1、Node接口的.getChildNodes() 返回得到该节点的子节点集合。(返回NodeList类型)
2、NodeList接口的.item(int index) 可通过索引值index获取具体某个节点。(返回Node类型)
3、Node接口的.getNodeType() 可返回节点的类型。可与Node的静态变量进行比较,筛选出Element类型的节点。
4、Node接口的.getNodeName() 可返回子节点的名称。
5、存储的信息实质为子节点的子节点。通过Node接口的.getFirstChild().getNodeValue()得到子节点的信息。或通过Node接口的.getTextContent()直接得到子节点的信息。(注意两者的不同)
特别之处:
1、通过Node类型的.getNodeType()与Node.ELEMENT_NODE比较,筛选出ELEMENT类型的节点。
2、子节点的内容实质为子节点的子节点的节点值。
3、创建实现
准备步骤:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.newDocument();
Document接口提供的方法:
Element createElement(String tagName)throws DOMException创建指定类型的元素。注意,返回的实例实现Element接口,所以可以直接在返回的对象上指定属性。此外,如果存在具有默认值的已知属性,则自动创建表示它们的Attr节点,并将其连接到该元素。
且从Node接口中继承了.appendChild()方法。
Element接口提供的方法:
void SetAttribute(String name,String value)throws DOMException添加一个新的属性。如果具有该名称的属性已经出现在元素中,则将其值更改为值参数的值。此值为简单的字符串;在设置它时没有对它进行解析。因此,将任何标记视为字面值文本,并且需要在写出由实现适当转移。为了分配包含实体引用的属性值,用户必须创建一个Attr节点,加上所有Text和EntityReference节点,构建适当的子树,并将它视为属性值,通过setAttributeNode方法来分配。
后续步骤:
TransformerFactory tff = TransformerFactory.newInstance();Transformer tf = tff.newTransformer();tf.transform(new DOMSource(document),new StreamResult(new File(文件地址)));
Transformer类中的方法:
public abstract void setOutputProperty(String name,String value)throws IllegalArgumentException设置转换中实际的输出属性。name可由OutputKeys来选定。
详细。
性能对比。
- Java 对xml文件的读写操作
- java对xml文件的操作
- Java 对xml文件的读写操作
- JAVA对xml文件的操作
- 对 Xml 文件的操作
- 对XMl文件的操作
- java 自己做的对XML文件的读写操作
- java对xml文件操作的工具类
- C#对XML文件的操作
- 对XML文件的基本操作
- Asp.Net对Xml文件的操作
- Asp.Net对Xml文件的操作
- Asp.Net对Xml文件的操作
- 对XML文件的基本操作
- ASP.net 对XML文件的操作
- jdom对xml文件的读写操作
- C#对XML文件的操作
- C#对XML文件的操作
- SDL Thread 相关API
- python技巧(7)
- kalilinux内网嗅探,局域网监控记录
- 分布式发布订阅消息系统—Apache Kafka
- windows10+kali linux2.0双系统安装
- JAVA对xml文件的操作
- 在Mac OS X Yosemite下搭建Apache+PHP+Mysql
- ARC 068E Snuke Line 区间问题+树状数组
- NOIP 2012 提高组 复赛 day2 mod 同余方程
- docker 1.13以及新特性
- C++指针——(1)指针基础
- 启动Oracle数据库报错:systax error or unresolved network name“LISTENER_ORCL”
- 双目相机--双目视差与深度距离关系推导详解
- 【Python学习】之 简单图形编程