JAXP代码实现步骤
我们在进行XML的时候,首先要拿到的肯定是实体文件在内存中的对象,API中叫Document
JDK文档中Document是个接口类型,不能通过new等方式去获取到
示例代码
//获取解析器工程对象
DocumentBuilderFactory factor = new DocumentBuilderFactory.newInstance();
//解析器工厂对象创建解析器对象
DocumentBuilder builder = factor.newDocumentBuilder();
//解析器解析实体XML文件返回Document对象
Document document = builder.parse(File file);//此处传入要解析的xml文件的File对象
示例代码
//getDocumentElement()方法 获取document中的根元素
Element root = document.getDocumentElement();
//getRlementsByTagName("元素名")方法 获取多个root下的次级元素
NodeList linkmanList = root.getRlementsByTagName("元素名");
//item(int index)方法获取指定索引元素 getTextContent()获取元素值
String value = linkmanList.item(0).getTextContent();
在XML解析的过程中,若对数据进行了修改操作,那么Java代码实际上只对内存中的这个对象进行了修改操作,要将最后的修改实际保存到文件中,还需要将当前内存中的数据输出保存到实际的XML,这个时候需要使用到Transformer类
API
Node接口:
//设置节点中的文本内容
void setTextContent(设置的值)
//写入到到文件中
TransformerFactory类:
//创建转换器新实例对象
TransformerFactory newInstance();
//创建一个新的转换器
Transformer newTransformer();
Transformer类:
//将内存中的DOM模型数据,写入实体文件中
void transformer(数据源,结果);
DOMSource(内存的文档对象中);
StreamResult(实体文件关联);
示例代码
//修改指定元素
linkmanList.item(0).setTextContent("新的值");
//获取转换器
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//将修改的内存中的内容写入文件
transformer.transform(new DOMSource(docment), new StreamResult("xml文件的路径"));
注意:删除节点的时候,需要使用元素本身的父节点去删除
API
Node接口:
//获取父节点
Node getParentNode();
//删除子节点
void removeChild(Element对象);
示例代码
//节点删除子节点
linkmanList.removeChild(Element对象);
//节点获取父节点以删除自身
node.getParentNode().removeChild(node);
API
Element接口:
//创建一个新的标签
Element createElement(标签名称)
//将一个标签添加到另一个标签中
void appendChild(Element对象)
//给标签添加一个属性
void setAttribute(属性名,属性值)
//根据属性名获取值
String getAttribute(属性名)
一个完整的从创建、新增到写入文件的过程演示代码
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
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.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.xml.sax.SAXException;
public class TestDOM {
/**
* 用于创建指定XML文件路径的DOM对象
* @param file:指定XML文件的文件路径
* @return:返回一个Document对象
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
public Document getDocment(File file) throws ParserConfigurationException, SAXException, IOException{
//工厂对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//获取DOM解析器对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//获取DOM对象
Document document = documentBuilder.parse(file);
//返回指定XML文件的DOM对象
return document;
}
/**
* 用于获得一个没有指定XML的DOM对象
* @return:返回没有指定XML的DOM对象
* @throws ParserConfigurationException
*/
public Document getDocment() throws ParserConfigurationException{
//工厂对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//DOM解析器对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//获取DOM对象
Document document = documentBuilder.newDocument();
//返回没有指定XML的DOM对象
return document;
}
/**
* 根据指定文件路径创建预先设置默认内容的XML文件
* @param file:文件路径的字符串表现形式
* @throws ParserConfigurationException
* @throws TransformerException
* @throws FileNotFoundException
*/
public void createXML(String file) throws ParserConfigurationException, TransformerException, FileNotFoundException{
//获取一个DOM无指定路径的对象
Document document = getDocment();
/*创建根节点*/
Element persons = document.createElement("persons");
/*创建一级子节点*/
Element person0 = document.createElement("person");
Element person1 = document.createElement("person");
person0.setAttribute("id","0");
person1.setAttribute("id","1");
/*创建二级子节点*/
Element name0 = document.createElement("name");
Element age0 = document.createElement("age");
Element sex0 = document.createElement("sex");
Element name1 = document.createElement("name");
Element age1 = document.createElement("age");
Element sex1 = document.createElement("sex");
/*将根目录加入到DOM对象*/
document.appendChild(persons);
/*将一级节点加入到根目录*/
persons.appendChild(person0);
persons.appendChild(person1);
/*将三级级节点加入到二级节点*/
person0.appendChild(name0);
person0.appendChild(age0);
person0.appendChild(sex0);
person1.appendChild(name1);
person1.appendChild(age1);
person1.appendChild(sex1);
/*将信息加入三级节点*/
name0.appendChild(document.createTextNode("至尊宝"));
age0.appendChild(document.createTextNode("21"));
sex0.appendChild(document.createTextNode("男"));
name1.appendChild(document.createTextNode("白晶晶"));
age1.appendChild(document.createTextNode("999"));
sex1.appendChild(document.createTextNode("女"));
/*写入存储*/
//获取写入工具
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
//拿到内存里面的数据
DOMSource domSource = new DOMSource(document);
//设置编码
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//将内存中的数据写出
transformer.transform(domSource, new StreamResult(new PrintWriter(new FileOutputStream(file))));
}
}