修改XML内容和xpath的语法

一、修改xml文件内容

对xml文件的操作有编辑、修改、删除。

1、修改

修改属性有两种方法:
//方法一:通过属性对象.setValue("属性值");
Attribute attr=Element对象.attribute("属性名");//调用标签对象的attribute()获取属性
attr.setValue("属性值");//修改属性值
//方法二:可以添加属性和属性值:如果属性名一致,值则会覆盖。
Element对象.addAttribute("属性名","属性值");

2、新增文档--会覆盖原来的文件内容

创建文件:
DocumentHelper.createDocument();//返回一个Document对象。

创建标签
添加根标签需要通过Document对象的addElement("根标签名").//会生成空标签
标签对象(Element对象).addElement("子标签名");//添加子标签,生成空标签。

创建属性
标签对象(Element对象).addAttribute("属性名","属性值");//给标签对象增加属性和属性值。

给标签设置文本内容
标签对象(Element对象).setText("文本内容");//设置文本内容

3、删除节点对象

删除节点对象:
方式一:采用detach()(推荐)
(Element对象)标签对象.detach();
方式二:使用父节点对象remove(子节点对象)
(Element对象)标签对象.getParent().remove(标签对象)

4、输出格式与字节字符流

字符输出:BufferedWriter   字符高效流
字节输出:OutputStream BufferedOutputstream 字节高效流

输出格式:
OutputStream类的createPrettyPrint():优雅格式:有空格换行
createCompactFormat():紧凑格式:用于部署上线。-->OutputFormat类的方法,返回OutputFormat类的对象。

测试代码:

package com.xunpu.xml.write;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.*;

/**
 * 修改contact.xml文件
 * 增加内容
 * 添加新的文档对象
 * 添加节点
 * 添加文本
 * 在原来xml文件的基础上编辑内容
 */
public class WriteDemo3 {
    public static void main(String[] args) throws DocumentException, IOException {

        //新增文档
//        DocumentHelper里面的一个方法
//        public static Document createDocument(Element rootElement) {
//            return getDocumentFactory().createDocument(rootElement);
//        }
        //1)读取文件
   Document doc=new SAXReader().read(new File("e:/contact.xml"));

        //2)对文件进行的一些操作
      // 修改文件
        edit();
        //添加属性,标签,文本
        // add();
        //删除文件
        //需求:要删除id是001所在的contact标签
//        del(doc);
        //3)覆盖
        OutputStream out=new FileOutputStream(new File("e:/contact.xml"));
        OutputFormat format=OutputFormat.createPrettyPrint();
        XMLWriter writer=new XMLWriter(out,format);
        writer.write(doc);


    }
    private static void del(Document doc) {
        //删除第一个contact子节点对象
        Element conElem=doc.getRootElement().element("contact");
//  方式一:采用detach()(推荐)
//      conElem.detach();
        //方式二:使用父节点对象remove(子节点对象)
       conElem.getParent().remove(conElem);

    }

    //新增文档(会覆盖原来文件的内容)
    private static void add() throws IOException {
        Document doc=DocumentHelper.createDocument();
        //创建节点元素对象: Element
       // doc.addElement("contact-list");//会生成空标签
        //添加标签
        Element rootElem=doc.addElement("contact-list");
        Element conElem=rootElem.addElement("contact");//会生成空标签
        //添加属性
        conElem.addAttribute("id","001");
        Element nameElem=conElem.addElement("name");
        //添加文本
        nameElem.setText("张三");
    }

    //选中代码,ctrl+alt+m--》抽取为一个方法  方法名自己设置。
    //修改相关的内容
    private static void edit() throws DocumentException, IOException {
        //1)读原来的文件
        Document document=new SAXReader().read(WriteDemo3.class.getClassLoader().getResource("contact.xml"));
        //2)修改
//        需求:将第一个contact子标签的属性id-->"003"
//方式一:直接可以通过Attribute对象设置属性值
        Element conElem=document.getRootElement().element("contact");
        Attribute idAttr=conElem.attribute("id");
        idAttr.setValue("003");
//方式二:可以添加属性和属性值:如果属性名一致,值则会覆盖。
        conElem.addAttribute("id","001");

        //修改文本内容
        //获取文本所在的标签对象
        Element nameElem=conElem.element("name");
        nameElem.setText("王五");
        //3)覆盖
        OutputStream out=new FileOutputStream(new File("e:/contact.xml"));
        OutputFormat format=OutputFormat.createPrettyPrint();
        XMLWriter writer=new XMLWriter(out,format);
        writer.write(document);
        writer.close();
    }
}

二、xpath语法

Xpath:当前xml文件结构层次比较深的时候,如果还是用Dom4j这种方式,比较麻烦,一些需求需要判断语句。
Xpath可以快速定位到某个标签中,根据xpath表达式的语法!

1、Xpath的一些常用语法

Xpath表达式:常用的有:
1)/:绝对路径   选中根标签/子标签
/AAA-->选中AAA元素
/AAA/CCC-->AAA标签中的CCC子元素
绝对路径,在xml文件中,如果“/”在前面,/contact-list(定位到根节点);
如果斜线在中间:/contact-list/contact:选中子节点contact标签
2)//:不分层级关系  选中所有的标签
//BBB:选中所有的BBB标签
//DDD/EEE:选中所有DDD标签中的EEE标签
/AAA/CCC/DDD/*:选中AAA下的CCC下的DDD中的所有标签
/*/*/*/BBB:BBB有三个父节点,选中满足三个父节点的所有BBB标签。
//*:选中所有标签
3)*:通配符   /contact-list/*:选中contact-list下面的子节点(不包含孙节点):contact标签
/contact-list//*:选中contact-list下面的所有节点
4)[]:进一步定位元素,类似于定语。其中数字元素标签在选择集中的位置 eg:/AAA/BBB[1]
	//contact[last()]
5)@:定位属性  @属性名称
6)=://AAA/BBB[@id='属性值']  确定属性值或文本值
7)逻辑与:and    <contact id="003" name="eric">   
             eg://contact[@id='001' and @name='eric']
8)text():
eg://name[text()='李四']

测试代码:

package com.xunpu.xml.xpath;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import javax.sql.DataSource;
import java.util.List;

/**
 * 关于xpath基本语法的使用
 */
public class XpathDemo1 {
    public static void main(String[] args) throws DocumentException {
        //1)读取当前resources,目录下的contact.xml文件
        Document doc=new SAXReader().read(XpathDemo1.class.getClassLoader().getResource("contact.xml"));

        //定义遍历
        String xpath=null;

        //  /:绝对路径   选中根标签或者子标签
        xpath="/contact-list";
        xpath="/contact-list/contact";

        //   //:不分层级关系,选中所有标签
        xpath="//contact";
        xpath="//contact//name";

        // *:通配符
        xpath="/contact-list/*";//当前根节点下的所有子节点,不包含孙节点。
        xpath="/contact-list//*";

        //  []:进一步定位到一个元素,类似于定语
        xpath="//contact[1]";//第一个contact标签
        xpath="//contact[last()]";//最后一个contact标签

        //@指定属性
        xpath="//@id";
        xpath="//contact[@name]";
        xpath="//contact[@id='002']";

        //and:逻辑与
        xpath="//contact[@id='001' and name='eric']";
        //text()文本内容是。。
        //文本内容是李四的name标签
        xpath="//name[text()]";


        //2)使用xpath技术定位节点,遍历
        //selectSingleNode(表达式)
        //selectNodes()
        List<Node> list= doc.selectNodes(xpath);
        for(Node node:list){
            System.out.println(node);
        }
    }
}

2、利用Xpath解析网页

html源代码为:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8"></meta>
		<title>xpath练习</title>
	</head>
	
	<!--
		编号	姓名	年龄	性别	住址	电话
	-->
	<body>
		<center><h1>联系人信息</h1></center>
		<table border="2" align="center" width="300px" height="300px">
			
			<thead>
			<tr align="center">	
			<th>编号</th>
			<th>姓名</th>
			<th>年龄</th>
			<th>性别</th>
			<th>住址</th>
			<th>电话</th>
			</tr>
			</thead>
		<tbody>
			<tr align="center">
				<td>001</td>
				<td>张三</td>
				<td>20</td>
				<td>男</td>
				<td>未央区</td>
				<td>123456</td>
			</tr>
			<tr align="center">
				<td>002</td>
				<td>李四</td>
				<td>23</td>
				<td>女</td>
				<td>长安区</td>
				<td>654123</td>
			</tr>
			<tr align="center">
				<td>003</td>
				<td>王五</td>
				<td>28</td>
				<td>男</td>
				<td>雁塔区</td>
				<td>654321</td>
			</tr>
		</tbody>
		</table>
	</body>
</html>

使用xpath技术解析html文件的测试代码为:

package com.xunpu.xml.xpath;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

/**
 * 使用xpath解析html页面
 */
public class XpathDemo2 {
    public static void main(String[] args) throws DocumentException {
        //1)创建SAXReader解析器对象
        SAXReader reader = new SAXReader();
        //2)获取document对象  读文件,使用绝对路径
        Document document=reader.read(new File("D:/比特/Java Web/java_web项目/test/js/xpath练习.html"));


        //3)使用xpath先定位title标签  不分层级关系选中title
        Element titleElem= (Element) document.selectSingleNode("//title");
        System.out.println(titleElem.getText());

        //4)获取单元格的内容
        System.out.println("编号\t姓名\t年龄\t性别\t\t住址\t\t电话");
        //使用xpath定位单元格的内容
        List<Element> trElem=document.selectNodes("//tbody/tr");
        for(Element e:trElem){
            //获取到tr元素
            //方式一:dom4j
//            String id=((Element)(e.elements("td").get(0))).getText();
            //方式二:xpath
            String id=e.selectSingleNode("td[1]").getText();
            String name=e.selectSingleNode("td[2]").getText();
            String gender=e.selectSingleNode("td[3]").getText();
            String age=e.selectSingleNode("td[4]").getText();
            String address=e.selectSingleNode("td[5]").getText();
            String phone=e.selectSingleNode("td[6]").getText();

            System.out.println(id+"\t\t"+name+"\t\t"+gender+"\t\t"+age+"\t\t"
            +address+"\t\t"+phone);
        }
    }
}

测试结果为:

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值