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。
注:设置此属性时不对此值进行任何验证。应用程序应该使用带有“validate”参数的Document.normalizeDocument()验证该值是否匹配在xml1.0中定义的有关独立文档声明的有效性约束。

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方法来分配。


且从Node接口继承了.appendChild()方法和.setTextContent(String textContent)方法

后续步骤:

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来选定。














详细。

性能对比。

0 0
原创粉丝点击