xml
- xml:可扩展标记语言,就是以一个统一的格式,组织有关系的数据,为不同平台下的应用程序服务。
语法规则:
- 文档声明要写就必须顶格写
- 只能有一个根标签
- 标签必须正确结束,并且不能交叉嵌套
- 严格区分大小
- 标签不能以数字开头
- 属性必须有值,且必须加双引号
转义字符:
- ‘<’<
- ‘>’>
- ‘&’ &
- ’ " " ’ "
- ’ ` ’ &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中,相当于注释。
- xml作用
- 配置文件
- 数据交换
- 数据存储
- 保存关系型数据
- xml解析
- dom解析:是w3c组织推荐的处理XML的一种方式(一次性读入,可以增删改查)
有两个分支,jDom与dom4j
dom4j:第三方封装包,dom下的一个分支,在jDom基础上进行的改进,我们常用dom4j替换原生的dom
- sax解析:不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它,只读不能改(边读边调用函数,仅支持查),省内存
PULL:对sax解析进行了进一步包装,使程序更好用
- 导入dom4j.jar包
- 下载后将jar包复制到新建或者存在的lib目录下,然后build
- 注意:在程序中如果用到了阅读器读取文件,则需要获取异常
- 报错
Syntax error, parameterized types are only available if source level is 1.5 or greater
右击项目–>properties–>java compiler -->选择enabel project specific setting -->Compiler compliance level :选择1.5版本,其他默认
右击项目–>properties -->project facets–>将java后的下拉框选择为5.0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iE5uDj35-1595231916254)(C:\Users\周灿隆\AppData\Roaming\Typora\typora-user-images\image-20200405102908466.png)]
- 代码
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(); } } }
- 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); } }
- 主要方法
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规则返回节点集合