一、XML定义
1.1、XML介绍
Extensible Markup Language 可扩展的标记语言.XML技术是W3C组织发布的,目前推荐遵循的是W3C组织于2000年发布的XML1.0规范。在现实生活中大量存在有关系的数据。可以通过XML技术来描述这些关系数据。在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据:一个标签可分为开始标签和结束标签。在开始标签和结束标签之间又可以使用其它标签描述其它数据。
<中国> <北京> <海淀></海淀> <丰台></丰台> </北京> <杭州> <西湖></西湖> <滨江></滨江> </杭州> </中国>
1.2、XML使用场景
- 保存有关系的数据
- 软件配置文件(描述程序之间的关系)
二、XML语法
2.1、XML语法组成
- 文档声明
<!--standalone:是否是独立的文档。--> <!--在xml中,空格和换行都作为原始内容被处理。--> <!--不要出现中文全角空格。--> <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
- 元素
<!--包含标签体--> <a>内容</a> <!--不包含标签体--> <a/> <!--嵌套标签,不允许交叉嵌套。--> <a> <b>内容2</b> </a> <!--XML文档只能有一个根标签。--> <soft> <c></c> <d></d> </soft> <!--对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。--> <网址> www.163.com </网址>
<!--XML属性的定义。--> <demo name="text"></demo> <!--也可以使用标签嵌套的方式来使用属性。--> <demo> <name>text</name> </demo>
- 注释
<!-- 注释 --> <!--XML声明之前不能有注释--> <!--注释不能嵌套-->
- CDATA区、特殊字符
- 处理指令(processing instruction)
二、XML约束
1、要用一定的规范来约束XML语言,按照自定义规范来编写XML文档。
2、XML约束技术:XML DTD 和 XML Schema技术。
三、XML约束:(DTD约束)
1、DTD(Document Type Definition文档类型定义) book.dtd
<!--元素定义:ELEMENT 书架(书+):括号里放入元素名称 书架ANY:括号里放入元素类型ANY标识任何类型 书(书名,作者,售价):用逗号分割,表示内容的出现顺序必须与声明时一致 书(书名|作者|售价):用|分割,表示任选其一,即多个只能出现一个 书+:一次或多次 书?:0次或一次 书*:0次或多次 书:必须出现一次 --> <!ELEMENT书架(书+)><!--中间空格不可缺--> <!ELEMENT书(书名,售价)> <!ELEMENT书名(#PCDATA)><!--#PCDATA:字符串--> <!ELEMENT作者(#PCDATA)> <!ELEMENT售价(#PCDATA)> <!--为元素设置属性--> <!--为标签配置属性定义 通过ATTLIST元素设置属性 属性名 属性值类型(CDTAT:字符串,ENUMERATED:枚举,ID,ENTITY:实体) 设置说明(#required:必须的。#IMPLIED:可以设置也可以不设置。#FIXED:固定值) <!ATTLIST元素名 姓名字符串可选的 年龄CDATA可选的 联系信息CDATA必须的 网站职务CDATA固定值提供的固定值 个人爱好CDATA直接使用默认值 > --> <!ATTLIST作者 姓名CDATA#IMPLIED 年龄CDATA#IMPLIED 联系信息CDATA#required 网站职务CDATA#FIXED"CTO" 个人爱好CDATA"ABC" >
2、book.xml就可以按照dtd文件元素定义的约束规范来写了。
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPE书架SYSTEM"book.dtd"> <书架> <书> <书名>Spring攻略第二版</书名> <作者联系信息="110">GaryMakJoshLong</作者> <售价>100元</售价> </书> <书> <书名>JavaWeb开发</书名> <作者联系信息="110">方立勋</作者> <售价>80元</售价> </书> </书架>
四、XML解析和DOM、SAX解析原理(XML解析开发包:Jaxp(官方API),Jdom,dom4j(性能最好))
-
DOM解析方式
/**
* DOM解析方式(文档对象模型 W3C标准) :
* DOM解析会把整个文档放入直接放入内存里(以对象树的方式)
* 1.把每个节点变成Element对象
* 2.把每个属性变成Attribute对象
* 3.把每个文本变成Text对象
* 优点:对文档的增删改查比较容易。
* 缺点:如果文档比较大,内存就会溢出。
* 在DOM解析下,xml文档的每一个组成部分都会用对象来表示,如:标签名用Element,属性名用Attribute
* 但是不管什么对象,都是Node(节点对象)的子类,在开发中获取的任意节点都可以当做Node来使用。
*/
/** *DOM解析:使用jaxp方式(性能最差) *获取某个节点下的文本值 *@throwsException */ @Test publicvoidtestJaxp1()throwsException{ //1.创建工厂 DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取代表文档的Document对象 Documentdocument=documentBuilder.parse("src/book.xml"); //4.获取指定标签名的元素,返回一个集合 NodeListnodeList=document.getElementsByTagName("书名"); //5.获取nodeList下指定的元素 Nodenode=nodeList.item(1); //6.获取元素下的文本值 Stringcontent=node.getTextContent(); //7.打印 System.out.println(content); } /** *DOM解析:使用jaxp方式(性能最差)遍历所有的节点(递归) *@throwsException */ @Test publicvoidtestJaxp2()throwsException{ //1.创建工厂 DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取代表文档的Document对象 Documentdocument=documentBuilder.parse("src/book.xml"); //4.获取根节点(根节点只有一个) NodeListnodeList=document.getElementsByTagName("书架"); Nodenode=nodeList.item(0); list(node); } privatevoidlist(Nodenode){ if(nodeinstanceofElement){ System.out.println(node.getNodeName()); } //1.得到当前根节点下的所有子节点 NodeListnodeList=node.getChildNodes(); //2.遍历所有的子节点 for(inti=0;i<nodeList.getLength();i++){ //3.如果当前子节点还有子节点,获取子节点的子节点 Nodechild=nodeList.item(i); //4.递归 list(child); } } //得到标签下的某个属性值 @Test publicvoidtestJaxp3()throwsException{ //1.创建工厂 DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取代表文档的Document对象 Documentdocument=documentBuilder.parse("src/book.xml"); //4.获取指定标签名的元素,返回一个集合(在这里我们知道作者这个标签是Element元素才进行强转) Elementelement=(Element)document.getElementsByTagName("作者").item(0); //5.获取属性值 Stringcontent=element.getAttribute("联系信息"); //6.打印 System.out.println(content); } //添加节点 @Test publicvoidtestJaxp4()throwsException{ //1.创建工厂 DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取代表文档的Document对象 Documentdocument=documentBuilder.parse("src/book.xml"); //4.创建标签 ElementpriceElement=document.createElement("售价"); //5.为标签体设置内容 priceElement.setTextContent("59"); //6.得到新创建的标签想要添加的位置 Nodebook=document.getElementsByTagName("书").item(0); //7.添加新创建的标签 book.appendChild(priceElement); //8.把更新后的内存中的document对象树重新写回xml文档里 Transformertransformer=TransformerFactory.newInstance().newTransformer(); SourcexmlSource=newDOMSource(document); transformer.transform(xmlSource,newStreamResult(newFileOutputStream("src/book.xml"))); }原文链接:https://www.f2er.com/xml/295387.html