5、xml

xml

  1. xml:可扩展标记语言,就是以一个统一的格式,组织有关系的数据,为不同平台下的应用程序服务。

语法规则:

  • 文档声明要写就必须顶格写
  • 只能有一个根标签
  • 标签必须正确结束,并且不能交叉嵌套
  • 严格区分大小
  • 标签不能以数字开头
  • 属性必须有值,且必须加双引号

转义字符:

  • ‘<’&lt
  • ‘>’&gt
  • ‘&’ &amp
  • ’ " " ’ &quot
  • ’ ` ’ &apos

CDATA区:此部分内容不会被解析器当成标签解析,在浏览器会原封不动输出

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>
</script>

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容

关于 CDATA 部分的注释:

CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。

也就是说,如果xml中部分需要大量<&等的转义字符,会使xml文档可读性降低,此时可以将这部分内容放在CDATA中,相当于注释。

  1. xml作用
  • 配置文件
  • 数据交换
  • 数据存储
  • 保存关系型数据
  1. xml解析
  • dom解析:是w3c组织推荐的处理XML的一种方式(一次性读入,可以增删改查)

有两个分支,jDom与dom4j

dom4j:第三方封装包,dom下的一个分支,在jDom基础上进行的改进,我们常用dom4j替换原生的dom

  • sax解析:不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它,只读不能改(边读边调用函数,仅支持查),省内存

PULL:对sax解析进行了进一步包装,使程序更好用

  1. 导入dom4j.jar包
  • 下载后将jar包复制到新建或者存在的lib目录下,然后build
  • 注意:在程序中如果用到了阅读器读取文件,则需要获取异常
  1. 报错

Syntax error, parameterized types are only available if source level is 1.5 or greater

  1. 右击项目–>properties–>java compiler -->选择enabel project specific setting -->Compiler compliance level :选择1.5版本,其他默认

  2. 右击项目–>properties -->project facets–>将java后的下拉框选择为5.0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iE5uDj35-1595231916254)(C:\Users\周灿隆\AppData\Roaming\Typora\typora-user-images\image-20200405102908466.png)]

  1. 代码
package com.atguigu.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class TestXmlParser {
	public void testXml3() throws Exception{
		//1.创建一个SAXReader
		SAXReader reader=new SAXReader();
		//2.读取文件
		Document document= reader.read(new File("stu.xml"));
		//3.解析返回的document对象,获取到根节点
		Element rootEle=document.getRootElement();
		//4.从根节点开始遍历封装
		List<Element> elements=rootEle.elements();
		List<Student> list=new ArrayList<>();
		for(Element ele:elements){
			//1.获取id
			String id=ele.attributeValue("id");
			//2.获取name值
			String name=ele.attributeValue("name");
			//3.获取age值
			String age=ele.attributeValue("age");
			int parseInt=0;
			try{
				parseInt=Integer.parseInt(age);
			}catch(Exception e){
				e.printStackTrace();
			}
			list.add(new Student(name,parseInt,id));
		}
		System.out.println(list);
	}
	public void testXml1() throws Exception{
		//1.导入dom解析包dom4j.jar
		//2.创建一个SAXReader  一个xml文档阅读器
		SAXReader saxReader =new SAXReader();
		//3.使用reader读取文件即可,返回document对象
		Document document= saxReader.read(new File("stu.xml"));
		System.out.println(document);
		//4.获取到document以后就可以执行增删改查
		
	}
	public void testXml2() throws Exception{
		//1.导包
		//2.创建一个阅读器
		SAXReader reader=new SAXReader();
		//3.使用阅读器读取文件
		Document document=reader.read(new File("stu.xml"));
		short nodeType=document.getNodeType();
		System.out.println(nodeType);
		//4.使用根节点往下找
		//getNodeType()获取当前节点类型
		//getName()获取当前节点名
		Element element=document.getRootElement();
		//5.使用根节点往下查找
		//获取当前节点下的所有子节点
		List<Element> elements=element.elements();
		for(Element ele:elements){
			//elementText(name)获取当前节点下名为name元素的文本值
			ele.elementText("");
			//getText() 获取当前标签下的文本值
			List<Element> stuChild=ele.elements();
			for(Element ele2:stuChild){
				//getText() 获取当前标签下的文本值
				System.out.println(ele2.getText());
			}
		}
		//elements代表所有student的集合
		for(Element eleTemp:elements){
			//每个eleTemp代表一个student标签
			String id=eleTemp.attributeValue("id");
			System.out.println("id值为:"+id);
			System.out.println("id值为:"+id);
		}
	}
	public void testXml4() throws Exception{
		//1.创建阅读器
		SAXReader reader=new SAXReader();
		//2.读取文档
		Document document=reader.read(new File("stu.xml"));
		//3.获取根节点
		Element rootElement=document.getRootElement();
		Element element=rootElement.element("student");
		Element name=element.element("name");
		name.setText("张三3");
		name.addAttribute("firstName", "张");
		//4.把修改的东西保存起来
		//OutputFormat将我们输出的数据格式化
		//OutputFormat format= OutputFormat.createCompactFormat();//创建压缩的
		OutputFormat format= OutputFormat.createPrettyPrint();//创建漂亮的格式
		//XMLWriter用来写document对象
		XMLWriter writer=new XMLWriter(new FileOutputStream("out.xml"));
		writer.write(document);
		writer.close();
	}
	
 	public static void main(String[] args){
		TestXmlParser test=new TestXmlParser();
		try{
			test.testXml1();
			test.testXml2();
			test.testXml3();
			test.testXml4();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
  1. xPath
  • xPath实在XML文档中查找信息的语言

  • 要导入jaxen jar包

  • 	//xPath用来简化dom查找
      	// /从根开始查找
      	// //找所有
      	// @ 代表属性
      	// 如://student[@id='123']
      	public void testXml5() throws Exception{
      		SAXReader reader=new SAXReader();
      		Document document=reader.read("stu.xml");
      		Element rootElement=document.getRootElement();
      		//用id 获取student id=456
      		Node node=rootElement.selectSingleNode("//student[@id='456']");
      		Element ele=(Element) node;
      		String id=ele.attributeValue("id");
      		System.out.println(id);
      		//获取到所有name标签
      		List<Element> list=rootElement.selectNodes("//name");
      		for(Element element : list){
      			String text=element.getText();
      			System.out.println(text);
      		}
      	}
  1. 主要方法

rootEle.elements();//返回下边的所有子节点 集合 List 类型

ele.getName();//获取元素名

ele.getText();//获取元素里面的文本值

ele.attributeValue(“属性名”); //获取元素的属性值

ele.elementText(“标签名”);获取ele标签名为传入参数的子元素的文本值

ele.element();//找到第一个子元素

ele.element(“tagName”);//找到ele第一个匹配的tagName子元素

ele.elements(“tagName”); //获取ele下的所有tagName子元素

xPath :快速查找元素

  • //:找到所有
  • /:从根开始查找
  • @:查找属性
  • 查看文档可以看到更多用法

用法

  • 导包 jaxen.jar

ele.selectSingleNode(xPath);//根据xPath规则获取单个节点

gName");//找到ele第一个匹配的tagName子元素

ele.elements(“tagName”); //获取ele下的所有tagName子元素

xPath :快速查找元素

  • //:找到所有
  • /:从根开始查找
  • @:查找属性
  • 查看文档可以看到更多用法

用法

  • 导包 jaxen.jar

ele.selectSingleNode(xPath);//根据xPath规则获取单个节点

ele.selectNodes(xPath);//根据xPath规则返回节点集合

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值