java与XML文件的读写

简介: java与XML文件的读写

DOM Document Object Model 的缩写,即文档对象模型。前面说过, XML 将数据组织为一颗树,所以 DOM 就是对这颗树的一个对象描叙。通俗的说,就是通过解析 XML 文档,为 XML 文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取 XML 文档的内容。


下面我们来看一个简单的例子,看看在 DOM 中,我们是如何来操作一个 XML 文档的。


这是一个 XML 文档,也是我们要操作的对象:


下面,我们需要把这个文档的内容解析到一个个的 Java 对象中去供程序使用,利用 JAXP ,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

我们在这里使用 DocumentBuilderFacotry 的目的是为了创建与具体解析器无关的程序,当 DocumentBuilderFactory 类的静态方法 newInstance() 被调用时,它根据一个系统变量来决定具体

使用哪一个解析器。又因为所有的解析器都服从于 JAXP 所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。这个工厂模式的具体实现,可以参看下面的类图。当获得一个工厂对象后, 使用它的静态方法 newDocumentBuilder() 方法可以获得一个 DocumentBuilder 对象,这个对象代表了具体的 DOM 解析器。


DOM 详解

DOM 的基本对象有 5 个: Document Node NodeList Element Attr 。下面就这些对象的功
能和实现的方法作一个大致的介绍。
Document
对象代表了整个 XML 的文档,所有其它的 Node ,都以一定的顺序包含在 Document
String message = my_node.getFirstChild().getNodeValue();
1
.基本的 DOM 对象


对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到 XML 文档的所有的内容,这也是对 XML 文档操作的起点。我们总是先通过解析 XML 源文件而得到一个 Document 对象,然后再来执行后续的操作。此外, Document 还包含了创建其它节点的方法,比如 createAttribut() 用来创建一个 Attr 对象。它所包含的主要的方法有:


createAttribute(String) :用给定的属性名创建一个 Attr 对象,并可在其后使用 setAttributeNode 方法来放置在某一个 Element 对象上面。
createElement(String)
:用给定的标签名创建一个 Element 对象,代表 XML 文档中的一个标签,然后就可以在这个 Element 对象上添加属性或进行其它的操作。
createTextNode(String)
:用给定的字符串创建一个 Text 对象, Text 对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的 Text 对象是这个 Element 对象的唯一子对象。
getElementsByTagName(String)
:返回一个 NodeList 对象,它包含了所有给定标签名字的标签。 getDocumentElement() :返回一个代表这个 DOM 树的根节点的 Element 对象,也就是代表 XML 文档根元素的那个对象。
Node
对象是 DOM 结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到 Node 这个对象,而是用到诸如 Element Attr Text Node 对象的子对象来操作文档。 Node 对象为这些对象提供了一个抽象的、公共的根。虽然在 Node 对象中定义了对其子节点进行存取的方法,但是有一些 Node 子对象,比如 Text 对象,它并不存在子节点,这一点是要注意的。 Node 对象所包含的主要的方法有: appendChild(org.w3c.dom.Node) :为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。 getFirstChild() :如果节点存在子节点,则返回第一个子节点,对等的,还有 getLastChild() 方法返回最后一个子节点。
getNextSibling()
返回在 DOM 树中这个节点的下一个兄弟节点, 对等的, 还有
getPreviousSibling()
方法返回其前一个兄弟节点。
getNodeName()
:根据节点的类型返回节点的名称。
getNodeType()
:返回节点的类型。
getNodeValue()
:返回节点的值。
hasChildNodes()
:判断是不是存在有子节点。
hasAttributes()
:判断这个节点是否存在有属性。
getOwnerDocument()
:返回节点所处的 Document 对象。
insertBefore(org.w3c.dom.Node new
org.w3c.dom.Node ref) :在给定的一个子对象前再插入一个子对象。
removeChild(org.w3c.dom.Node)
:删除给定的子节点对象。
replaceChild(org.w3c.dom.Node new
org.w3c.dom.Node old) :用一个新的 Node 对象代替给定的子节点对象。
NodeList
对象,顾名思义,就是代表了一个包含了一个或者多个 Node 的列表。可以简单的把它看成一个 Node 的数组,我们可以通过方法来获得列表中的元素:

GetLength() :返回列表的长度。
Item(int)
:返回指定位置的 Node 对象。
Element
对象代表的是 XML 文档中的标签元素,继承于 Node ,亦是 Node 的最主要的子对象。在标签中可以包含有属性,因而 Element 对象中有存取其属性的方法,而任何 Node 中定义的方法,也可以用在 Element 对象上面。
getElementsByTagName(String)
:返回一个 NodeList 对象,它包含了在这个标签中其下的子孙
节点中具有给定标签名字的标签。
getTagName()
:返回一个代表这个标签名字的字符串。
getAttribute(String)
:返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为 XML
文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到
getAttributeNodes()
方法来得到一个 Attr 对象来进行进一步的操作。
getAttributeNode(String)
:返回一个代表给定属性名称的 Attr 对象。


Attr 对象代表了某个标签中的属性。 Attr 继承于 Node ,但是因为 Attr 实际上是包含在 Element 的,它并不能被看作是 Element 的子对象,因而在 DOM Attr 并不是 DOM 树的一部分,所以 Node
中的 getparentNode() getpreviousSibling() getnextSibling() 返回的都将是 null 。也就是说,
Attr
其实是被看作包含它的 Element 对象的一部分,它并不作为 DOM 树中单独的一个节点出现。这一点在使用的时候要同其它的 Node 子对象相区别。


需要说明的是,上面所说的 DOM 对象在 DOM 中都是用接口定义的,在定义的时候使用的是与具体语言无关的 IDL 语言来定义的。因而, DOM 其实可以在任何面向对象的语言中实现,只要它实现了 DOM 所定义的接口和功能就可以了。同时,有些方法在 DOM 中并没有定义,是用 IDL
的属性来表达的,当被映射到具体的语言时,这些属性被映射为相应的方法。


有了上面的介绍,相信你对DOM理解的更多了吧。下面的例子将让你对DOM更加熟悉起来。


package com.dzf.test;

 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.Vector;

 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;

 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;

 /***/ /**
 * @author dengzhifeng
 *
 */
 public class Writexml ... {
 private Documentdocument;

 private Stringfilename;

 private boolean validating;

 public Writexml(Stringname) throws ParserConfigurationException ... {
 filename = name;
 DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance();
 DocumentBuilderbuilder = factory.newDocumentBuilder();
 document = builder.newDocument();
 }

 public VectortoRead(Stringfilename) ... {
 Vectortitle = new Vector();
 Vectorcontent = new Vector();
 StringmyStr = new String();
 try ... {
 DocumentBuilderFactoryfactory = DocumentBuilderFactory
 .newInstance();
 factory.setValidating(validating);
 DocumentBuilderbuilder = factory.newDocumentBuilder();
 document = builder.parse( new File(filename));
 document.getDocumentElement().normalize();
 Nodenode = document.getFirstChild();
 NodeListlist = node.getChildNodes();
 for ( int i = 0 ;i < list.getLength();i ++ ) ... {
 Nodenodeitm = list.item(i);
 if (nodeitm.getNodeName().equals( " Title " )) ... {
 myStr = nodeitm.getFirstChild().getNodeValue();
 title.addElement(myStr); // getFirstChild()
 }
 if (nodeitm.getNodeName().equals( " Content " )) ... {
 myStr = nodeitm.getFirstChild().getNodeValue();
 content.addElement(myStr);
 }
 }
 } catch (Exceptionexp) ... {
 exp.printStackTrace();
 return null ;
 }
 Vectorall = new Vector();
 all.add(title);
 all.add(content);
 return all;
 }

 public void toWrite(Stringmytitle,Stringmycontent) ... {
 Elementroot = document.createElement( " D " );
 document.appendChild(root);
 Elementsegment = document.createElement( " RH " );
 root.appendChild(segment);
 ElementH_segment = document.createElement( " CH " );
 H_segment.setAttribute( " Name " , " FCon_number " );
 H_segment.setAttribute( " Type " , " string " );
 H_segment.setAttribute( " Value " , " 编码 " );
 H_segment.setAttribute( " Visible " , " false " );
 H_segment.setAttribute( " Readonly " , " true " );
 segment.appendChild(H_segment);
 ElementH_segment1 = document.createElement( " CH " );
 H_segment1.setAttribute( " Name " , " FName " );
 H_segment1.setAttribute( " Type " , " string " );
 H_segment1.setAttribute( " Value " , " 条件名称 " );
 H_segment1.setAttribute( " Visible " , " true " );
 H_segment1.setAttribute( " Readonly " , " true " );
 segment.appendChild(H_segment1);
 ElementH_segment2 = document.createElement( " CH " );
 H_segment2.setAttribute( " Name " , " FCon_exp " );
 H_segment2.setAttribute( " Type " , " string " );
 H_segment2.setAttribute( " Value " , " 条件 " );
 H_segment2.setAttribute( " Visible " , " true " );
 H_segment2.setAttribute( " Readonly " , " true " );
 segment.appendChild(H_segment2);
 ElementH_segment3 = document.createElement( " CH " );
 H_segment3.setAttribute( " Name " , " FCon_sum " );
 H_segment3.setAttribute( " Type " , " string " );
 H_segment3.setAttribute( " Value " , " 结论 " );
 H_segment3.setAttribute( " Visible " , " true " );
 H_segment3.setAttribute( " Readonly " , " flase " );
 segment.appendChild(H_segment3);
 Elementtitle = document.createElement( " Title " );
 title.appendChild(document.createTextNode(mytitle));
 root.appendChild(title);
 Elementtitle1 = document.createElement( " Title " );
 title1.appendChild(document.createTextNode( " title1 " ));
 root.appendChild(title1);
 Elementcontent = document.createElement( " Content " );
 content.appendChild(document.createTextNode(mycontent));
 content.appendChild(document.createTextNode( " content1 " ));
 root.appendChild(content);
 Writexml.save(root);
 }

 public static void save(Nodedoc) ... {
 StringWritermysw = new StringWriter();
 // // System.out.println("doc===="+doc);
 if (doc != null ) ... {
 try ... {
 TransformerFactorytransFact = TransformerFactory.newInstance();
 Transformertrans = transFact.newTransformer();
 doc.normalize();
 trans.transform( new DOMSource(doc), new StreamResult(mysw));
 System.out.println(mysw.toString());
 } catch (TransformerConfigurationExceptiontce) ... {
 tce.printStackTrace(System.err);
 } catch (TransformerExceptionte) ... {
 te.printStackTrace(System.err);
 }
 }
 // return"";
 }


目录
相关文章
|
2天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
13 2
|
1月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
|
1月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
57 1
|
7天前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
53 8
|
6天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
16 2
|
15天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
16天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
24 4
|
19天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
19天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
28天前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
47 2