要进行操作的XML文档users.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><users>
<user id="A001">
<name>Jack</name>
<age>22</age>
</user>
<user id="A002">
<name>张三</name>
<age>31</age>
</user>
</users>
对XML文档进行【查询】:
核心操作:
(1)找到xml文档的根节点node
(2)使用Documnet元素中的getElementsByTagName(String name)找到指定的元素
(3)依次遍历此节点下的文本内容属性及其子节点
代码演示:
/*
* 查---遍历
* (需求:要求按照数据库的格式输出XML文档的所有数据,id、name、age占一行)
*/
@Test
public void iteratorDemo() throws Exception{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document dom=db.parse("./xml/users.xml");
Node root=dom.getFirstChild();
Element eroot=(Element) root;
//获取所有的user元素
NodeList nodeList=eroot.getElementsByTagName("user");
for(int i=0;i<nodeList.getLength();i++){
//操作某一个user
Element euser=(Element) nodeList.item(i);
String id=euser.getAttribute("id");//id
NodeList nameList=euser.getElementsByTagName("name");//name
String name=((Element)nameList.item(0)).getTextContent();
NodeList ageList=euser.getElementsByTagName("age");//age
String age=(ageList.item(0)).getTextContent();
System.out.println("id="+id+",name="+name+",age="+age);
System.out.println("---------------------------------------");
}
}
执行结果:
对XML文档进行【修改】:
核心操作:
(1)找到指定要修改的文本内容位置,将其值设置setTextContent(String name)。
(2)修改好此xml文档dom树之后,因为树是在内存中,修改好后要将其保存到硬盘中,所以此处会用到一个转换类:Transformer。
(3)创建好Transformer对象并调用其方法transfrom(…)便可保存。
代码演示:
/*
* 改 ---需求:把最后的一个user的年龄改为age+10
*/
@Test
public void updateDemo() throws Exception{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document dom=db.parse("./xml/users.xml/");
Node root=dom.getFirstChild();
Element eroot=(Element) root;
NodeList nodeList=eroot.getElementsByTagName("user");
Element euser=(Element) nodeList.item(nodeList.getLength()-1);
Node nodeAge=euser.getElementsByTagName("age").item(0);
Element eage=(Element) nodeAge;
String age=eage.getTextContent();
age=Integer.parseInt(age)+10+"";
eage.setTextContent(age);
//需要将修改后的内存树保存到磁盘中--使用javax.xml.transform 中的transform类
TransformerFactory trans=TransformerFactory.newInstance();
Transformer transformer=trans.newTransformer();
DOMSource xmlSource=new DOMSource(dom);
StreamResult outputTarget=new StreamResult(new File("./xml/users.xml"));
transformer.transform(xmlSource, outputTarget);
}
执行结果:
执行完修改程序后,打开xml文档,会出现一个“文件已经修改”的弹框,此时user为“A002”的age为31:
点击yes之后,发现age的值已经改变,变为41,说明修改成功!
【注意事项】:xmlSource是通过new DOMSource(dom)来获得的。
对XML文档进行【删除】:
核心操作:
(1)找到指定要删除的节点位置。
(2)然后找其父节点删自己。
(3)最后将内存中删除后的xml文档树保存到硬盘中。
代码演示:
/*
* 删---需求:把文档中的最后一个节点删除掉
*/
@Test
public void delNode() throws Exception{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document dom=db.parse(new File("./xml/users.xml"));
Element eroot=(Element) dom.getFirstChild();
NodeList nodeList =eroot.getElementsByTagName("user");
Element userNode=(Element) nodeList.item(nodeList.getLength()-1);
userNode.getParentNode().removeChild(userNode);
//保存内存中的xml树
TransformerFactory trans=TransformerFactory.newInstance();
Transformer transformer=trans.newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(new File("./xml/users.xml/")));
}
执行结果:
删除和修改一样,文件都被修改了,因此打开此xml文件会弹出对话框,点击yes,一个节点移除,说明删除成功了!
删除前:
删除后:
对XML文档进行【增加】:
核心操作:
(1)要增加一个节点,此节点的结构必须和存在的节点结构是相同的。
(2)首先要为此节点添加属性,name节点及其文本内容,age节点及其文本内容。
(3)将name,age节点加到新的
<user>
节点上。(4)最后将此新节点
<user>
加到根节点上 。但是注意★★★:
最后添加新的孩子节点的时候:
(1)不能用dom.appendChild(newUser);这种方式添加,这种方式就相当于给一个dom树添加了两个根节点,这在xml中是不允许的。
(2)必须要获得其第一个孩子节点才可以添加:dom.getFirstChild.appendChild(newUser)。
代码演示:
/*
* 增:
* ---需求:给文档添加一个新的<user>节点
* ---思路:
* (1)要增加一个节点,此节点的结构必须和存在的节点结构是相同的。
* (2)首先要为此节点添加属性,name节点及其文本内容,age节点及其文本内容。
* (3)将name,age节点加到新的<user>节点上。
* (4)最后将此新节点<user>加到根节点上 。
*/
@Test
public void addDemo() throws Exception{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document dom=db.parse("./xml/users.xml/");
//创建新的user节点
Element newUser=dom.createElement("user");
//给此新的user节点设置属性
newUser.setAttribute("id", "B001");
//创建name节点
Element eName=dom.createElement("name");
//为name节点设置文本内容
eName.setTextContent("Rose");
//创建age节点
Element eAge=dom.createElement("age");
//为age节点设置文本内容
eAge.setTextContent("100");
//将eName,eAge节点加到newUser节点上
newUser.appendChild(eName);
newUser.appendChild(eAge);
/*将newUser节点加到根节点上,注意此处不能用这种方式添加:dom.appendChild(newUser);
* 这种方式就相当于给一个dom树添加了两个根节点,这是不允许的,要让其第一个孩子节点添加
* 才是可以的:dom.getFirstChild().appendChild(newUser);
*/
//
dom.getFirstChild().appendChild(newUser);
//保存
TransformerFactory trans=TransformerFactory.newInstance();
Transformer transformer=trans.newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(new File("./xml/users.xml/")));
}
执行结果:
可以看到,添加后的节点内容是在一行的,这是因为从内存写入到硬盘中使用的file流,file流是没有格式的,只是一个序列流。