【XML解析】(2)利用DOM解析技术对XML文档进行增删改查操作

要进行操作的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流是没有格式的,只是一个序列流。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值