什么是XML?
我通常是理解为解释数据的文件,例如,给出单独一个[20]的数据,我们并不知道这是什么东西,但如果是[age,20],我们就能稍微理解一下年龄是20岁,在稍微拓展一下[Student,name,tom,age,20],能够将其阅读为一个名叫tom的学生年纪为20岁,如果用XML的风格将其书写的话则如下图
<Student>
<name>tom</name>
<age>20</age>
</Student>
XML常规语法
- 任何的起始标签都必须有一个结束标签
- 可简化写法,例如< name >< /name > 可以写为< name/ >
- 大小写敏感,如< name > 和 < Name >是不一样的
- 每个文件都要有个根元素
- 标签必须按合适的顺序进行嵌套
- 有特性就必须有值,且在值的周围加上引号
- 有转义字符,如“<”需要则用& lt;代替
DOM方法解析XML
DOM:Document Object Model 文档对象模型,擅长小规模的XML文件读写。
前提须知
这里给一个简单的XML文件
<font>
<name>Helvetica</name>
<size>36</size>
</font>
其通过DOM形式来表达如下:
Document是根元素
然后接下来就可以看到font,而font中只有name和size是我们XML文件中本来就有的,whitespace是什么呢,我这里来解释一下
<font>
这里含有一个whitespace
<name>Helvetica</name>
这里含有一个whitespace
<size>36</size>
这里含有一个whitespace
</font>
后面我们利用DOM方式解析时,去获得数据或者遍历时,需要了解他是有个whitespace,那个并不是我们需要去获取的。
DOM类
主要是通过DocumentBuilder的parse方法进行解析
Node是节点的主接口,Node中有个方法getChildNodes返回的是一个NodeList,简单来说就是条用该方法可以获取该节点的所有的子节点
当我们去便利NodeList节点列表的时候,我们又可以通过item()方法拿出里面的每个元素Node。
Node利用getChildNodes获取到NodeList,接着NodeList遍历获得Node,Node再用getChildNodes去获得,以此反复,便可以获得XML文件中所有的数据
Document为文档根节点
Element为标签节点元素(每一个标签都是标签节点)
DOM类例子(自上而下遍历进行访问)
首先创建一个XML文件,我这里取名为users.xml,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<student>
<name>Tom</name>
<subject>math</subject>
<score>80</score>
</student>
接着Java代码如下:
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DomReader {
public static void main(String[] args) {
recursiveTraverse();
}
public static void recursiveTraverse(){
try {
//采用Dom解析XML文件(基本这三句是固定格式)
DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance();
DocumentBuilder DB=DBF.newDocumentBuilder();
Document document=DB.parse("users.xml");
//根元素
System.out.println("DOM形式下第一个节点标签document:"+document.getNodeName());
//获取根元素下的节点并将其遍历
NodeList list=document.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node Node=list.item(i);
System.out.println("document下的子节点:"+Node.getNodeName());
//获取student标签下的元素并遍历
NodeList list2=Node.getChildNodes();
for (int j = 0; j < list2.getLength() ; j++) {
Node Node2=list2.item(j);
//排除获得到的#text,即空值
if(Node2.getNodeType()==Node.ELEMENT_NODE)
{
NodeList resultList=Node2.getChildNodes();
for (int k = 0; k < resultList.getLength(); k++) {
Node result=resultList.item(k);
System.out.println("Student下的子节点"+Node2.getNodeName()+":"+result.getTextContent());
}
}
}
}
}catch (Exception error){
System.out.println(error);
}
}
}
显示效果如下:
DOM类例子(查标签名进行访问)
首先创建一个XML文件,我这里取名为users.xml,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<student>
<name>Tom</name>
<subject>math</subject>
<score>80</score>
</student>
java代码如下:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DomReader {
public static void main(String[] args) {
//查名取值
traverseBySearch();
}
public static void traverseBySearch(){
try {
//采用Dom解析XML文件(基本这三句是固定格式)
DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance();
DocumentBuilder DB=DBF.newDocumentBuilder();
Document document=DB.parse("users.xml");
//根元素
System.out.println("DOM形式下第一个节点标签document:"+document.getNodeName());
//获取Student节点
Element element=document.getDocumentElement();
System.out.println(element.getNodeName());
//寻找所有Student节点下name,subject,score标签名的节点
NodeList nameList=element.getElementsByTagName("name");
NodeList subjectlist=element.getElementsByTagName("subject");
NodeList scoreList=element.getElementsByTagName("score");
for (int i = 0; i < nameList.getLength(); i++) {
System.out.println("名字="+nameList.item(i).getTextContent()+" 学科"+subjectlist.item(i).getTextContent()+" 成绩:"+scoreList.item(i).getTextContent());
}
}catch (Exception e){
}
}
}
显示效果如下:
DOM例子(写DOM文件)
import org.w3c.dom.Document;
import org.w3c.dom.Element;
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 java.io.File;
public class DomWriter {
public static void main(String[] args) {
try {
//固定格式
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dbBuilder=dbFactory.newDocumentBuilder();
//新创建一个Document节点,同时后面的元素都采用Document创建元素
Document document=dbBuilder.newDocument();
if(document!=null){
Element docx=document.createElement("document");
Element element=document.createElement("student");
element.setAttribute("type","paragraph");
element.setAttribute("alignment","left"); //为element添加两个属性
//设置student下的节点
Element name=document.createElement("name");
name.appendChild(document.createTextNode("tom"));
Element subject=document.createElement("subject");
subject.appendChild(document.createTextNode("math"));
Element score=document.createElement("score");
score.appendChild(document.createTextNode("95"));
//将标签分别设置在下面
element.appendChild(name);
element.appendChild(subject);
element.appendChild(score);
docx.appendChild(element);
document.appendChild(docx);
//创建完DOM接着(固定格式)
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
DOMSource source=new DOMSource(document);
//目标文件
File file=new File("users.xml");
StreamResult result=new StreamResult(file);
//将xml内容写道文件中
transformer.transform(source,result);
System.out.println("修改成功");
}
}catch (Exception error){
System.out.println(error);
}
}
}
显示效果如下: