XML(可扩展标记语言),是一种用于标记电子文件使其具有结构性的标记语言。Xml文件标签可以进行自定义,对大小写敏感,XML文件主要用于存储数据。
XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中DOM解析和SAX解析是最常用最基础的解析方式。
本文针对该XML文件,对DOM解析进行详细描述:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<student id="001">
<name>aa</name>
<age>18</age>
</student>
<student id="002">
<name>bb</name>
<age>28</age>
</student>
<student id="003">
<name>cc</name>
<age>38</age>
</student>
</configuration>
DOM(Document Object Model)解析,即文档对象模型。是一个通过将XML文件读取到内存中,转化成一个树形结构的解析过程。因此通过DOM接口,应用程序可以在任何时候访问xml文档中的任何一部分数据。
将该xml文件转换成树为:
该xml文件中,Node 是所有节点的父接口,并且Element、Text 、Attribute Document -----父接口都是Node。其中文本节点如aa,18bb,28,cc,38;元素节点和属性节点如student,name,age;属性节点如id=“001”。
DOM解析XML文件主要通过运用DocumentBuilderFactory类、DocumentBuilder类、Document接口,对XML文件进行增删改查主要通过Node接口和Element接口进行操作。
public static void main(String[] args) {
try {
//1.单例模式 获取document解析工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.通过文档解析工厂对象 去获取解析对象
DocumentBuilder builder = factory.newDocumentBuilder();
//3.通过文档解析器获取文档对象
Document doc = builder.parse("test.xml");
//获取根节点
Element root = doc.getDocumentElement();
//按文档顺序返回包含在文档中且具有student的所有Element的NodeList
NodeList list = doc.getElementsByTagName("student");
//遍历
for(int i = 0;i < list.getLength();i++){
System.out.println(list.item(i).getTextContent());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
对上述XML文件进行简单的增删改并将操作打印到XML文件中:
public class XmlOperation {
Document doc = null;
Node root = null;
public XmlOperation() throws IOException, SAXException, ParserConfigurationException {
//对test.xml文件操作
doc = GeneralMethod.getDocumentInstance("test.xml");
root = doc.getDocumentElement();
}
//添加性别
public void addElement(){
//创建text
Element sex = doc.createElement("sex");
//把text添加为element的节点
Text sextext = doc.createTextNode("男");
//插入到文档中去
Node sexNode = sex.appendChild(sextext);
Node root = doc.getDocumentElement();
Node stuNode = root.getFirstChild().getNextSibling();
stuNode.insertBefore(sex, stuNode.getFirstChild());
}
//删除性别
public void delete(){
Node student = doc.getElementsByTagName("student").item(0);
Element studentElement = (Element) student;
Node sex = studentElement.getElementsByTagName("sex").item(0);
student.removeChild(sex);
}
//将name的aa修改为seven
public void modify(){
Node student = doc.getElementsByTagName("student").item(0);
Element studentElement = (Element) student;
Node name = studentElement.getElementsByTagName("name").item(0);
Element nameEle = (Element) name;
nameEle.setTextContent("seven");
}
public void printXML(){
//打印到xml文件中
DOMSource ds = new DOMSource(root);
TransformerFactory tff = TransformerFactory.newInstance();
try {
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(ds, new StreamResult("test.xml"));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}