XML之JavaSE Dom解析
概述
对于重量级配置文件XML,JavaSE提供了用于解析的API,本章简单讲解如何用Java进行XML文档内容的增删查减。
Java 提供了 Document(文档)、Attribute(属性节点)、Text(文本节点)、Element(元素节点)及Node
优点:能够操作文档树,完成元素的增删查找。
缺点:Dom解析需将整个xml文档读取保存到内存中,针对大件文件性能比较低;
1、获取到文档对象来操作XML文档
//利用抽象类DocumentBuilderFactory中的静态方法进行实例化
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//调用抽象类DocumentBuilderFactory的实例化对象的方法对抽象类DocumentBuilder进行实例化
DocumentBuilder builder = factory.newDocumentBuilder();
//抽象类DocumentBuilder的实例化对象对XML文档进行解析
Document document = builder.parse(uri);//uri为XML文档路径 String
2、通过文档对象获取元素集合
//Document实例对象调用 方法getElementsByTagName(String tagname)通过元素名获得元素集合,
NodeList nodeList = document.getElementsByTagName(tagname);
3、元素集合中的方法
int getLength() 返回该元素的个数
Node item(int index) 输入下标获取元素节点
//遍历元素
for(int i=0; i<nodeList.length();i++){
nodeList.item(i);//nodeList.item(i)为一个Node节点
}
Node节点可调用的方法
short node.getNodeType(); 得到Node类型
String node.getNodeName(); 得到Node名
String node.getNodeValue(); 得到Node值
String getTextContent();得到Node文本内容
4、遍历元素内容
//遍历元素内容
for(int i=0; i<nodeList.length();i++){
//遍历取元素节点内容
System.out.println(nodeList.item(i).getTextContent());
}
5、增加元素节点
//创建元素 tagName为想要创建元素名
Element createElement = document.createElement(String tagName);
//创建文本 data为想要创建文本内容
Text createTextNode = document.createTextNode(String data);
//将创建的文本内容加入到创建的元素中
createElement.appendChild(createTextNode);
//取得元素节点,该节点为增加元素的父节点
NodeList nodeList = document.getElementsByTagName("p");
//在指定节点下增加子节点
nodeList.item(0).appendChild(createElement);
以上完成文档内容的增加,但是目前操作仅为内存中操作,需要将以上操作写入XML文档;
//修改后的Document实例写入XML文档,传入修改后的Document实例
private static void writeBack(Document document) throws TransformerFactoryConfigurationError,
TransformerConfigurationException, IOException, TransformerException {
//以下文回写的代码,后面对document增删改后均写入XML
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Source source = new DOMSource(document);
Result result = new StreamResult(new FileWriter("src/config/student.xml"));
transformer.transform(source, result);
}
写好回写的代码后,后面增删改操作可直接调用方法进行回写,写入文件中。
6、删除元素
//tagName 为需要删除的元素名
NodeList dest = document.getElementsByTagName(tagName);
//移除元素,通过指定节点调用getParentNode()方法得到父节点,再用父节点的删除方法删除子节点
//removeChild(Node node)删除子节点
dest.item(0).getParentNode().removeChild(dest.item(0));
//回写
writeBack(document);
7、修改元素内容
//通过元素名tagName获得需要修改的元素集合
NodeList elementsByTagName = document.getElementsByTagName(tagName);
//elementsByTagName.item(0)得到需要修改的指定元素
//setTextContent(newData);修改元素文本内容
elementsByTagName.item(0).setTextContent(newData);
//回写
writeBack(document);