Java-XML文件操作

x33g5p2x  于2021-10-06 转载在 Java  
字(19.5k)|赞(0)|评价(0)|浏览(413)

如果你是初学者,看的话肯定是看不懂的 代码太乱了各种技术混合, 我下面源码包括用到的全部代码都贴上了 你只需要 按部就班的打完 然后在仔细看一遍就会了

xml文件

<?xml version="1.0" encoding="utf-8" ?>
<student>
    <name id="name">胡安民</name>
    <age>123</age>
    <sex>男</sex>
</student>

student 就是根节点 其他的节点就是student的子节点…

元素就是标签 属性 就是标签的的变量

在xml 中 < > 会被 解析的 所以 在内容中不能使用但是可以使 用 &lt;``&gt;

还可以使用 <name>哈希把<![CDATA[ 内容不会被转义 ]] </name> 在这里面写的内容是不会被转义的

xml 约束

xml约束就是规范文件内容的

一个xml 文件中只能有一个 DTD约束

DTD:一种简单的约束技术

  1. 内部dtd:将约束规则定义在xml文档中 也就是 创建xml的格式必须符合约束
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> ]>

<students>
    <student number="s12">
        <name>胡安民</name>
        <age>21</age>
        <sex>男</sex>
    </student>
    <student number="s13">
        <name>胡安民</name>
        <age>21</age>
        <sex>男</sex>
    </student>
</students>

students (student+) 代表 根元素必须是students 子元素可以有至少1个以上student

student (name,age,sex) 是student 元素内必须有 name,age,sex这三个子元素

name (/#PCDATA) age (/#PCDATA) sex (/#PCDATA) 代表是内容必须是文本

student number ID /#REQUIRED 代表 是唯一的值 而且首个字必须 为非数字

  1. 外部dtd:将约束的规则定义在外部的dtd文件中

外部导入方式

本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件的位置”>

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM "yueshu.dtd">
<students>
    <student number="s12">
        <name>胡安民</name>
        <age>21</age>
        <sex>男</sex>
    </student>
    <student number="s13">
        <name>胡安民</name>
        <age>21</age>
        <sex>男</sex>
    </student>
</students>

导入网络上的DTD约束:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

Schema:一种复杂的约束技术

一般情况 自己使用 的不多 都是引用 别人写好的 框架 比如mvc

后缀是xsd

xsd约束文件内容

<?xml version="1.0"?>
<!-- xmlns="http://www.xh.cn/xml" 这个是 命名空间 用于别人 引用你写的文件约束 -->
<!--xmlns:xsd="http://www.w3.org/2001/XMLSchema" 是固定的 官方-->
<!--最后一行 就是进行认证 调用自己的 命名空间 固定写法 -->
<xsd:schema xmlns="http://www.xh.cn/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xh.cn/xml" elementFormDefault="qualified">


<!-- 定义一个 根节点 students type是变量 用在xsd文件下的 其他节点 来调用 类似别名 -->
    <xsd:element name="students" type="studentsType"/>
<!-- 在students根节点的基础上 添加 子元素 -->
    <xsd:complexType name="studentsType">
        <xsd:sequence>
<!-- 在students下 定义一个子节点 student 加上约束 minOccurs 是最少定义多少个 student节点 maxOccurs是最大定义多少个节点 0=可以不定义 1代表最少定义一个 .... unbounded=无限个 -->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>


<!-- 在student下 定义一个子节点 name age sex 创建xml的也要按照 这个顺序 -->
    <xsd:complexType name="studentType">
        <xsd:sequence>
<!-- 定义一个name 节点 内容是字符串类型 -->
            <xsd:element name="name" type="xsd:string"/>
<!-- 定义一个age 起一个别名 在下面 进行 进行约束添加-->
            <xsd:element name="age" type="ageType" />
 <!-- 定义一个sex 起一个别名 在下面 进行 进行约束添加-->
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
<!-- 给当前节点 student 添加 属性 number required=唯一 -->
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>

<!-- 给number属性添加 约束 xsd:string 字符串类型 value="p_\d{4}" =正则表达式 -->
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
<!-- 文本内容 必须是 p_ 开头的 然后跟上4位数字 -->
            <xsd:pattern value="p_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>

<!--给 age 节点添加 约束 -->
    <xsd:simpleType name="ageType">
<!-- 文本内容 必须是 数字类型-->
        <xsd:restriction base="xsd:integer">
<!-- 数值 最小 0 -->
            <xsd:minInclusive value="0"/>
<!-- 数值 最大256 -->
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>


 <!--给 sex节点添加 约束 -->
    <xsd:simpleType name="sexType">
<!-- 文本内容 必须是 字符串类型-->
        <xsd:restriction base="xsd:string">
<!-- 使用的是 枚举 内容必须是male 或者 female 二选一 -->
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>

xml约束导入

  1. 单个文件的导入
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 1.填写xml文档的根元素 要导入文件的约束 根 2.引入xsi前缀. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 固定的 3.为每一个xsd约束声明一个前缀,这个前缀 就是在你的xsd文件中声明的 xmlns="http://www.xh.cn/xml" 4.引入xsd文件命名空间 也就是路径. xsi:schemaLocation="http://www.xh.cn/xml student.xsd" -->
 <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xh.cn/xml" xsi:schemaLocation="http://www.xh.cn/xml student.xsd">
<!-- 按照约束 来写xml 文件 节点-->
   <student number="p_0001">
      <name>tom1</name>
      <age>18</age>
      <sex>male</sex>
   </student>
       
 </students>
  1. 多个文件的导入

多个xsd文件 需要起别名来其引入,会发现 根节没有约束 如果非要进行 根约束 那么 只能从多个约束文件中选一个使用别名:来进行根节点约束 但是这样的话 节点内容 就必须按照 别名文件的约束走 其他的约束无效 所以 自己根据情况 选择 如果是多约束那么 就无法限制根节点 如果是单个文件那么就能限制 根节点(整个xml)

说了这么多估计你也看不懂…

<?xml version="1.0" encoding="UTF-8" ?>
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.xh.cn/xml" xmlns:b="http://www.xh_1.cn/xml" xsi:schemaLocation=" http://www.xh.cn/xml student.xsd http://www.xh_1.cn/xml student_1.xsd ">

<!-- 按照约束 来写xml 文件 节点-->
   <a:students>
      <a:student number="p_1234">
         <a:name>胡安民</a:name>
         <a:age>20</a:age>
         <a:sex>female</a:sex>
      </a:student>
   </a:students>

   <b:students>
      <b:student number="p_1234">
         <b:name>胡安民</b:name>
         <b:age>20</b:age>
         <b:sex>female</b:sex>
      </b:student>
   </b:students>

 </xml>

没事看不懂 跳过就行了 会不会不影响 难道给自己找麻烦吗?? 一般这都不是我们写的 我们只要会操作xml就行了

代码创建xml文件

添加dom4j依赖 如果有了就不用添加了 还有其他很多种操作xml的方式…

我这里提供下载地方:

链接:https://pan.baidu.com/s/1W5EdX7tgjS_V6lEtMcnmvw
提取码:1234

Maven

<dependency>
  <groupId>dom4j</groupId>
  <artifactId>dom4j</artifactId>
  <version>1.6.1</version>
</dependency>
@Test
    public void showriz() {

        // 创建文档对象。
        Document document = DocumentHelper.createDocument();
        // 文档增加第一个节点,即根节点,一个文档只能有一个根节点,多加出错 然后创建的其他节点都是在根节点内
        Element root = document.addElement("xml_gen");
        // 添加注释 (可有可无) 注释是在节点上方 的 <!--?? -->
        root.addComment("第一个技能");
        // 根节点下添加节点
        Element first = root.addElement("day_1");
        // 节点添加属性
        first.addAttribute("name", "独孤九剑");
        // 节点下添加节点
        Element info = first.addElement("info");
        // 节点设置内容数据
        info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");

        // 同上 增加其他节点,内容,属性等
        Element second = root.addElement("day_2");

        second.addAttribute("name", "葵花宝典");

        Element info2 = second.addElement("info");

        info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");

        // 创建节点
        Element third = DocumentHelper.createElement("skill");
        // 将节点加入到根节点中
        root.add(third);
        // 创建属性
        Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");
        // 将属性加入到节点上
        third.add(name);
        // 创建子节点并加入到节点中
        Element info3 = DocumentHelper.createElement("day_1");
        info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");
        third.add(info3);

   
        
        
 //将document对象内的内容 写入到文件里
        FileOutputStream file=null;
        OutputStreamWriter fos=null;
        XMLWriter writer=null;
        try {
            // 创建格式化类
            OutputFormat format = OutputFormat.createPrettyPrint();
            // 设置编码格式,默认UTF-8
            format.setEncoding("UTF-8");

            // 创建输出流文件不存在就创建
             file = new FileOutputStream("C:\\Users\\12841\\Desktop\\test\\day.xml");
             fos=new OutputStreamWriter(file,"utf-8");
            // 创建xml输出流
            writer = new XMLWriter(fos, format);
            // 生成xml文件
            writer.write(document);

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                writer.close();
                fos.close();
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

运行后结果:

如果需要添加文档 的DocType

// 设置文档DocType,这里为了举例,添加hibernate的DocType

document.addDocType("hibernate-configuration",

            "-//Hibernate/Hibernate Configuration DTD 3.0//EN", "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");

使用dom4j读取xml内容

需要dom4j 依赖

链接:https://pan.baidu.com/s/1W5EdX7tgjS_V6lEtMcnmvw
提取码:1234

Maven

<dependency>
  <groupId>dom4j</groupId>
  <artifactId>dom4j</artifactId>
  <version>1.6.1</version>
</dependency>

我的xml文件

<?xml version="1.0" encoding="utf-8" ?>
<xml>
    <student>
        <firstname>cxx1</firstname>
        <firstname>cxx1----</firstname>
        <lastname>Bob1</lastname>
        <nickname>stars1</nickname>
        <marks>85</marks>
    </student>
    <student rollno="493">
        <firstname>cxx2</firstname>
        <lastname>Bob2</lastname>
        <nickname>stars2</nickname>
        <marks>85</marks>
    </student>
    <student rollno="593">
        <firstname>cxx3</firstname>
        <lastname>Bob3</lastname>
        <nickname>stars3</nickname>
        <marks>85</marks>
    </student>
</xml>

常用的 方法

getName() 获取节点名称 或者 属性名称

getValue()获取节点 属性值

getText().trim() 获取当前节点的文本内容 如果内容为空则返回一个空字符串而不是null

getStringValue().trim() 获取当前节点和之下节点所有文本 然后内容连接成字符串.

获取document对象

//获取项目路径
        String ph=System.getProperty("user.dir"); //获取当前的顶级目录 的绝对路径
//将顶级目录的盘符\ 进行转义 成\\ java能识别的盘符
        String ph1=ph.replace("\\","\\\\");
//添加文件的相对路径 然后将结果和绝对路径进行对比下看看对不对
        ph1+="\\\\src\\\\main\\\\src\\\\cn\\\\htsa\\\\www\\\\test\\\\xml_1.xml";
        System.out.print(ph1);

//如果打包成war 你的文件一般情况都是在classes下
String ph=request.getServletContext().getRealPath("/")+"WEB-INF" +"\\classes\\xml_1.xml ";
//1.创建Reader对象
  SAXReader reader = new SAXReader();
//读取xml文件内容
Document document = reader.read(new File(ph1));

//或者 这种方式 只要你的文件在Resources目录里 不管在不在服务器端 都能获取到
 	InputStream resourceAsStream = 当前类名.class.getClassLoader().getResourceAsStream("beans.xml");
        try {
            document = reader.read(resourceAsStream);
        } catch (DocumentException e) {
            e.printStackTrace();
        }

如果是xml字符串的话

Document document= DocumentHelper.parseText(s1);

节点遍历(文本 属性名称 属性值)

//3.获取根节点
Element rootElement = document.getRootElement();
elementIterator获取节点下第一层节点
Iterator iterator = rootElement.elementIterator();
while (iterator.hasNext()){
    //获取节点的对象
    Element stu = (Element) iterator.next();
System.out.print(stu.getName());//获取节点名称
// attributes 返回节点的属性集合
List<Attribute> attributes = stu.attributes();
//获取节点 属性的名称 和 值
for (Attribute attribute : attributes) {
    System.out.print(   attribute.getName());
    System.out.println(attribute.getValue());
}
//继续往下遍历 
Iterator iterator1 = stu.elementIterator();
while (iterator1.hasNext()){
    Element stuChild = (Element) iterator1.next();
    System.out.println("节点名:"+stuChild.getName()+"---节点值:"+stuChild.getStringValue());
}

}

节点名:firstname—节点值:cxx1----
节点名:lastname—节点值:Bob1
节点名:nickname—节点值:stars1
节点名:marks—节点值:85
studentrollno493
节点名:firstname—节点值:cxx2
节点名:lastname—节点值:Bob2
节点名:nickname—节点值:stars2
节点名:marks—节点值:85
studentrollno593
节点名:firstname—节点值:cxx3
节点名:lastname—节点值:Bob3
节点名:nickname—节点值:stars3
节点名:marks—节点值:85

根据使用情况进行拆装代码

将xml字符串 转为Map

private Map<String, String> parseXml(String xml){
    //解析结果
    Map<String,String> resultMap = new HashMap<String,String>();
    try {
        // 将xml String转化为xml
        Document document = DocumentHelper.parseText(xml);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 获取各个节点中的数据
        for (Element e : elementList) {
            resultMap.put(e.getName(), e.getText());
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    return resultMap;
}

但是如果是在服务端 使用的是mvc框架的方式的话那么

//将别人传来的xml文件解析结果存储在HashMap中 然后在返回前端进行处理
//当然你在后端处理也可以 不返回了就行了
	@SuppressWarnings(path = "/wx_xinxi",method = {RequestMethod.GET})  
    public  Map<String, String> parseXml(HttpServletRequest request) throws Exception {  
        Map<String, String> map = new HashMap<String, String>();  
        // 从request中取得输入流 
        InputStream inputStream = request.getInputStream();  
        // 读取输入流 
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);  
        // 得到xml根元素 
        Element root = document.getRootElement();  
        // 得到根元素的所有子节点 
        List<Element> elementList = root.elements();  

        // 遍历所有子节点 
        for (Element e : elementList)  {
       map.put(e.getName(), e.getText());  
}
     
        // 释放资源 
        inputStream.close(); 

        return map;  
}

将document对象转为字符串

String xml="<messge>"+
                    "<name>hu</name>"+
                    "<age>22</age>" +
                    "</messge>";
                Document document= DocumentHelper.parseText(xml);
                List list = document.selectNodes("/messge");
// 查询 document的内容
                System.out.println("原xml");
                String s = document.asXML();

<?xml version=“1.0” encoding=“UTF-8”?>

<messge><name>hu</name><age>22</age></messge>

自动会给你补上<?xml version=“1.0” encoding=“UTF-8”?>

使用XPath 路径的方式来快速遍历节点(重要)

document.selectNodes(路径) 来选取节点 返回的是list 记住只有document对象中才有selectNodes方法

添加依赖

dom4j-1.6.1.jar

链接:https://pan.baidu.com/s/1W5EdX7tgjS_V6lEtMcnmvw
提取码:1234

jaxen-1.2.0.jar

链接:https://pan.baidu.com/s/14M4TWD-ksgzKfIgb8JVlZg
提取码:1234

maven

<dependency>
  <groupId>jaxen</groupId>
  <artifactId>jaxen</artifactId>
  <version>1.2.0</version>
</dependency>
<dependency>
  <groupId>dom4j</groupId>
  <artifactId>dom4j</artifactId>
  <version>1.6.1</version>
</dependency>

我的xml

<?xml version="1.0" encoding="UTF-8"?>

<xml_gen>
    <day_1 name="独孤九剑">
        <info age="22">为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info>
        <name num="10" num1="11">哈哈哈1</name>
        <li>
            <li_1>我是内</li_1>
        </li>
        <info age="33">要有风清扬、令狐冲。</info>

    </day_1>

    <day_2 name="葵花宝典">
        <info age="男">宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。</info>
        <info age="女">首先要自宫净身。</info>
        <name num="50">哈哈哈2</name>
    </day_2>

    <skill name="北冥神功">
        <day_1 name="wox">逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。</day_1>
        <name num="100">
            <age>男</age>
        </name>
    </skill>

</xml_gen>

先获取获取document对象 在上面dom4j有教程怎么获取的

Xpath 语法

常用的 方法

getName() 获取节点名称 或者 属性名称

getValue()获取节点 属性值

getText().trim() 获取当前节点的文本内容 如果内容为空则返回一个空字符串而不是null

getStringValue().trim() 获取当前节点和之下节点所有文本然后内容连接成字符串.

/ //路径匹配

/就是绝对匹配的 //就是模糊匹配(所有)

注意的是: 比如/a/b 此时b下面还有b 那么他不会匹配b下面的子节点b 但是如果换成/a//b 那么b的子节b 也会匹配的

/a//b 意思就是a节点下的所有b节点

//b就是所有b节点 包括子节点

/a/b/c 意思就是a下的b节点下的c节点 不会在往下了

@匹配属性

匹配xml_gen节点下的day_1节点下所有包含name属性的节点

/xml_gen/day_1/@name

匹配所有是name属性的节点

//@name

匹配所有day_1节点下是name属性的节点

//day_1/@name

[>=<… ]条件匹配属性值

匹配所有day_1节点 属性是name=wox 的节点

//day_1[@name=‘wox’]

匹配xml_gen节点下所有/name节点属性num>40 下的节点age

/xml_gen//name[@num>40]

[?]查找指定节点

匹配所有info节点的第一个节点

//info[1]

匹配xml_gen节点下的day_2节点下的第一个info节点

/xml_gen/day_2/info[1]

… 选取当前节点的上一级节点

匹配xml_gen节点下day_1节点下info节点的上一级节点

/xml_gen/day_1/info/…

匹配所有info的上一级节点

//info/…

[last()]选取元素的最后一个元素

匹配xml_gen节点下day_2节点下info节点的最后一个

/xml_gen/day_2/info[last()]

/* 选取所有指定元素

匹配所有节点

/*

匹配xml_gen节点下day_1节点下所有元素包括子元素…

/xml_gen/day_1//*

匹配xml_gen节点下所有带有属性的info节点

/xml_gen//info[@/*]

| 多选匹配匹配

匹配day_1下的第一个info标签 和 day_2下的name标签

//day_1/info[1]|//day_2/name

遍历节点文本,属性名称,和属性值

List list = document.selectNodes("/xml_gen/day_1/name");
       
for (Iterator it = list.iterator(); it.hasNext();) {
            Element stuChild = (Element) it.next();//节点对象
            //获取此节点下所有text
    System.out.println(stuChild.getStringValue().trim());
            // 使用Element节点对象 可以获取所有此节点上的 属性名和值
            List<Attribute> attributes = stuChild.attributes();
            for (Attribute attribute : attributes) {
                System.out.print("属性名称:"+attribute.getName());
                System.out.println("属性值:"+attribute.getValue());
            }
        }

哈哈哈1
属性名称:num属性值:10
属性名称:num1属性值:11

只遍历节点的属性名称和值

List list = document.selectNodes("/xml_gen//@name");
        for (Iterator it = list.iterator(); it.hasNext();) {
            Attribute attributes = (Attribute) it.next();//节点对象
            System.out.println(attributes.getName());
            System.out.println(attributes.getValue());
        }

name
独孤九剑
name
葵花宝典
name
北冥神功
name
wox

只遍历节点文本

List list = document.selectNodes("/xml_gen/day_1/*");
        for (Iterator it = list.iterator(); it.hasNext();) {
            Element  element = ( Element) it.next();//节点对象
            System.out.println(element.getStringValue().trim());
        }

为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。
哈哈哈1
我是内
要有风清扬、令狐冲。

修改XML内容

使用XPath 来选择对象

这里注意的是 无论是 删除还是修改 都是在内存中做的操作 没有对原文件进行 操作 所以需要将内存中的修改或者删除后的xml对象重新写入到原文件中 覆盖一遍才能成功

先获取获取document对象 在上面dom4j有教程怎么获取的

修改节点文本内容

List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
    Element stuChild = (Element) it.next();
    //更新节点 day_1下的所有info的文本内容
   stuChild.setText("只要998");

}

修改节点 属性值

List list = document.selectNodes("//day_1//info/@*");
for (Iterator it = list.iterator(); it.hasNext();) {
    Attribute attr = (Attribute) it.next();//属性对象
        if(attr.getName()=="age"){
            attr.setValue("123");
     }
}

修改节点名称

List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
    Element stuChild = (Element) it.next();
    stuChild.setName("info1");
}

修改节点属性名

List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
    Element stuChild = (Element) it.next();
    //添加num 属性 值还是age的值不变
    stuChild.addAttribute("num", stuChild.attribute("age").getValue());
    //然后将age属性删除
    stuChild.remove(stuChild.attribute("age"));

}

删除XML内容

使用XPath 来选择对象

这里注意的是 无论是 删除还是修改 都是在内存中做的操作 没有对原文件进行 操作 所以需要将内存中的修改或者删除后的xml对象重新写入到原文件中 覆盖一遍才能成功

先获取获取document对象 在上面dom4j有教程怎么获取的

删除节点

//我删除 day_1节点下的所有info节点
        List list = document.selectNodes("//day_1//info");
        for (Iterator it = list.iterator(); it.hasNext();) {
            Element stuChild = (Element) it.next();
	//获取到info节点的父节点 然后删除父级点下的所有info节点
            if(stuChild.getParent().remove(stuChild)){
                System.out.println("删除成功");
            }
        }

删除节点属性

List list = document.selectNodes("//day_1//info");
        for (Iterator it = list.iterator(); it.hasNext();) {
            Element stuChild = (Element) it.next();
	//删除所有day_1节点下的所有info节点的age属性
            if(stuChild.remove(stuChild.attribute("age"))){
             System.out.println("删除成功");        
            }
        }

增加xml内容

先获取获取document对象 在上面dom4j有教程怎么获取的

添加节点/节点属性/节点值

@Test
        public  void show() throws Exception {

            String xml="<messge>"+
                    "<name>hu</name>"+
                    "<age>22</age>" +
                    "</messge>";
                Document document= DocumentHelper.parseText(xml);
                List list = document.selectNodes("/messge");
// 查询 document的内容
                System.out.println("原xml");
                String s = document.asXML();
                System.out.println(s);
                for (Iterator it = list.iterator(); it.hasNext();) {
                        Element stuChild = (Element) it.next();//节点对象
                        if (stuChild.getName().equals("messge")){
// 添加节点标签
                                Element element = stuChild.addElement("money");
// 添加节点标签 Text
                                element.addText("1000");
// 添加节点属性
                                element.addAttribute("language","cn");

                        }
                }
// 查询 document的内容
                System.out.println("添加后xml");
                String s1 = document.asXML();
                System.out.println(s1);

        }

原xml

<?xml version=“1.0” encoding=“UTF-8”?>

<messge> <name>hu</name> <age>22</age> </messge> 添加后xml <?xml version=“1.0” encoding=“UTF-8”?> <messge <name>hu</name> <age>22</age> <money language=“cn”>1000</money> </messge>

覆盖

FileOutputStream file=null;
        OutputStreamWriter fos=null;
        XMLWriter writer=null;
        try {
            // 创建格式化类
            OutputFormat format = OutputFormat.createPrettyPrint();
            // 设置编码格式,默认UTF-8
            format.setEncoding("UTF-8");

            // 你要修改或者删除或者创建的xml位置 如果不存在就创建
             file = new FileOutputStream("C:\\Users\\12841\\Desktop\\test\\day.xml");
             fos=new OutputStreamWriter(file,"utf-8");
            // 创建xml输出流
            writer = new XMLWriter(fos, format);
            // 生成xml文件
            writer.write(document);

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                writer.close();
                fos.close();
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

相关文章