XML
student.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam>
<student examid="222" idcard="111">
<name>张三</name>
<location>沈阳</location>
<grade>89</grade>
</student>
<student examid="444" idcard="333">
<name>李四</name>
<location>大连</location>
<grade>97</grade>
</student>
</exam>
dom
DomXmlAdmin.java
package com.dwt1220;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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;
public class DomXmlAdmin {
public static void main(String[] args) throws Exception {
/**************************** 创建Document类 *********************************************/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("./src/student.xml");
///**************************** 添加student节点*********************************************/
// /**
// * ①创建节点
// * ②设置节点的值(包括属性)
// * ③获得节点插入的位置
// * ④插入节点
// * ⑤更新文件
// */
// /** ①创建节点 */
// /************ 创建student节点 **********/
// Element studentElement = document.createElement("student");
// /************ 创建name,location,grade节点 **********/
// Element nameElement = document.createElement("name");
// Element locationElement = document.createElement("location");
// Element gradeElement = document.createElement("grade");
// /** ②设置节点的值(包括属性) */
// /************ 设置name,location,grade节点的值 ******/
// nameElement.setTextContent("nameValue");
// locationElement.setTextContent("locationValue");
// gradeElement.setTextContent("gradeValue");
// /************ 设置student节点的属性 *******/
// studentElement.setAttribute("examid", "value");
// studentElement.setAttribute("idcard", "value");
// /** ③获得节点插入的位置 */
// /************ 获得XML的根节点 ******/
// Node rootNode = document.getElementsByTagName("exam").item(0);
// /** ④插入节点 */
// /************ 把student节点添加到根节点下 ******/
// rootNode.appendChild(studentElement);
// /************ 把name,locationt,gradet节点添加到student节点下 ******/
// studentElement.appendChild(nameElement);
// studentElement.appendChild(locationElement);
// studentElement.appendChild(gradeElement);
// /** ⑤更新文件 */
// TransformerFactory transformerFactory = TransformerFactory
// .newInstance();
// Transformer tf = transformerFactory.newTransformer();
// tf.transform(new DOMSource(document), new StreamResult(
// new FileOutputStream("./src/student.xml")));
///**************************** 修改name节点*********************************************/
//
// /**
// * 把name值为nameValue修改成newValue
// * ① 获得name节点的list
// * ②查找内容相符的name节点
// * ③修改节点内容
// * ④更新文件
// */
// String updataValue = "nameValue";
// String newValue = "newValue";
//
// /************ ① 获得需要修改的节点 **************/
// NodeList nameNodeList = document.getElementsByTagName("name");
//
// /************ ②查找内容相符的节点 **************/
// for (int i = 0; i < nameNodeList.getLength(); i++) {
//
// /************ ③修改节点内容 **************/
// if (updataValue.equals(nameNodeList.item(i).getTextContent())) {
// nameNodeList.item(i).setTextContent(newValue);
// }
// }
//
// /** ④更新文件 */
// TransformerFactory transformerFactory = TransformerFactory
// .newInstance();
// Transformer tf = transformerFactory.newTransformer();
// tf.transform(new DOMSource(document), new StreamResult(
// new FileOutputStream("./src/student.xml")));
///***************************** 删除节点or替换节点****************************/
//
// /***
// * 把name值为nameValue的Student节点删除 ① 获得name节点的list ②查找内容相符的name节点
// * ③获得name的Student父节点, 从Student的父节点删除student ④更新文件
// */
// String delaValue = "nameValue";
//
// /************ ① 获得name节点的list **************/
// NodeList nameNodeList = document.getElementsByTagName("name");
//
// /************ ②查找内容相符的name节点 **************/
// for (int i = 0; i < nameNodeList.getLength(); i++) {
// if (delaValue.equals(nameNodeList.item(i).getTextContent())) {
// /************* ③获得name的Student父节点,从Student的父节点删除student**************/
// nameNodeList.item(i).getParentNode().getParentNode().removeChild(nameNodeList.item(i).getParentNode());
// /******* 如果要替换节点用.replaceChild(newChild, oldChild)方法 ************/
// }
// }
//
// /** ④更新文件 */
// TransformerFactory transformerFactory = TransformerFactory
// .newInstance();
// Transformer tf = transformerFactory.newTransformer();
// tf.transform(new DOMSource(document), new StreamResult(
// new FileOutputStream("./src/student.xml")));
/************** 解析xml ************************/
/**** 获得根节点 *****/
Element rootElement = document.getDocumentElement();
/**** 获得所有student节点 ****/
NodeList studentNodeList = rootElement.getElementsByTagName("student");
/**** 打印student的节点名,和值 ****/
for (int i = 0; i < studentNodeList.getLength(); i++) {
/**** 获得所有student下的所有子节点 ****/
NodeList studentChildNodeList = studentNodeList.item(i)
.getChildNodes();
/**** 打印student下的所有字节点的,节点名 和值 ※回车算一个字text节点 ****/
for (int j = 0; j < studentChildNodeList.getLength(); j++) {
System.out.println(studentChildNodeList.item(j).getNodeName()
+ " " + studentChildNodeList.item(j).getTextContent());
}
}
}
}
sax
SAXXmladmin.java
package com.dwt1220;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SAXXmladmin extends DefaultHandler {
public static void main(String[] args) throws Exception {
/**
* 1.创建解析工厂 SAXParserFactory 2.得到解析器 SAXParser 3.得到读取器 XMLReader
* 4.设置内容处理 xMLReader.setContentHandler(handler)
* 传入一个继承了ContentHandler,并重写了其中方法的类 (一般继承实现了ContentHandler,
* DefaultHandler类) 5.读取xml文档内容
*/
/******************** 1.创建解析工厂 *************************/
SAXParserFactory factory = SAXParserFactory.newInstance();
/******************** 2.得到解析器 *************************/
SAXParser sp = factory.newSAXParser();
/******************** 3.得到读取器 *************************/
XMLReader reader = sp.getXMLReader();
/******ListHandler得到xml文档所有内容
* TagValueHandler得到xml文档指定内容 *************************/
ContentHandler handler = new TagValueHandler();
/******************** 4.设置内容处理 *************************/
reader.setContentHandler(handler);
/******************** 5.读取xml文档内容 *************************/
reader.parse("src/student.xml");
}
}
/******* 得到xml文档所有内容 ************/
class ListHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument");
}
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
/**
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -
* 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,
* attributes.getQName(i)提前属性名 etValue(i)提取属性值
*/
System.out.print("<" + qName + " ");
for (int i = 0; attributes != null && i < attributes.getLength(); i++) {
System.out.print(attributes.getQName(i) + "=\""
+ attributes.getValue(i) + "\" ");
}
System.out.println(">");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</" + qName + ">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
/**
* ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。
*/
System.out.println(new String(ch, start, length));
}
}
/******* 得到xml文档指定内容 ************/
class TagValueHandler extends DefaultHandler {
private String currentTag;// 记住当前解析到的是什么标签
private int needNumbe = 2; // 记住想获取第几个作者标签的值
private int currentNumber=0;// 当前解析到的是第几个
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
/**
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -
* 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,
* attributes.getQName(i)提前属性名 etValue(i)提取属性值
*/
currentTag = qName;
if (currentTag.equals("name")) {
currentNumber++;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
/**
* ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。
*/
/*********("name").equals(currentTag)一定要("name")在前********************/
if (("name").equals(currentTag) && currentNumber == needNumbe) {
System.out.println("name:" + new String(ch, start, length));
}
}
}

本文介绍如何使用DOM和SAX两种方式解析XML文件,并演示了如何通过Java实现XML文件的读写、节点的添加与修改等常见操作。

被折叠的 条评论
为什么被折叠?



