Extensible Markup Language 可扩展的标记语言.XML技术是W3C组织发布的,目前推荐遵循的是W3C组织于2000年发布的XML1.0规范。在现实生活中大量存在有关系的数据。能够经过XML技术来描述这些关系数据。在XML语言中,它容许用户自定义标签。一个标签用于描述一段数据:一个标签可分为开始标签和结束标签。在开始标签和结束标签之间又可使用其它标签描述其它数据。node
<中国> <北京> <海淀></海淀> <丰台></丰台> </北京> <杭州> <西湖></西湖> <滨江></滨江> </杭州> </中国>
<!--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声明以前不能有注释--> <!--注释不能嵌套-->
一、要用必定的规范来约束XML语言,按照自定义规范来编写XML文档。app
二、XML约束技术:XML DTD 和 XML Schema技术。dom
一、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" >
二、book.xml就能够按照dtd文件元素定义的约束规范来写了。网站
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>Spring攻略第二版</书名> <做者 联系信息="110">Gary Mak Josh Long</做者> <售价>100元</售价> </书> <书> <书名>JavaWeb开发</书名> <做者 联系信息="110">方立勋</做者> <售价>80元</售价> </书> </书架>
DOM解析方式 ui
/**spa
* DOM解析方式(文档对象模型 W3C标准) :code
* DOM解析会把整个文档放入直接放入内存里(以对象树的方式)orm
* 1.把每一个节点变成Element对象xml
* 2.把每一个属性变成Attribute对象
* 3.把每一个文本变成Text对象
* 优势:对文档的增删改查比较容易。
* 缺点:若是文档比较大,内存就会溢出。
* 在DOM解析下,xml文档的每个组成部分都会用对象来表示,如:标签名用Element,属性名用Attribute
* 可是无论什么对象,都是Node(节点对象)的子类,在开发中获取的任意节点均可以当作Node来使用。
*/
/** * DOM解析:使用jaxp方式(性能最差) * 获取某个节点下的文本值 * @throws Exception */ @Test public void testJaxp1() throws Exception{ //1.建立工厂 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取表明文档的Document对象 Document document = documentBuilder.parse("src/book.xml"); //4.获取指定标签名的元素,返回一个集合 NodeList nodeList = document.getElementsByTagName("书名"); //5.获取nodeList下指定的元素 Node node = nodeList.item(1); //6.获取元素下的文本值 String content = node.getTextContent(); //7.打印 System.out.println(content); } /** *DOM解析:使用jaxp方式(性能最差) 遍历全部的节点(递归) * @throws Exception */ @Test public void testJaxp2() throws Exception{ //1.建立工厂 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取表明文档的Document对象 Document document = documentBuilder.parse("src/book.xml"); //4.获取根节点(根节点只有一个) NodeList nodeList = document.getElementsByTagName("书架"); Node node = nodeList.item(0); list(node); } private void list(Node node) { if(node instanceof Element){ System.out.println(node.getNodeName()); } //1.获得当前根节点下的全部子节点 NodeList nodeList = node.getChildNodes(); //2.遍历全部的子节点 for (int i = 0; i <nodeList.getLength(); i++) { //3.若是当前子节点还有子节点,获取子节点的子节点 Node child = nodeList.item(i); //4.递归 list( child ); } } //获得标签下的某个属性值 @Test public void testJaxp3() throws Exception{ //1.建立工厂 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取表明文档的Document对象 Document document = documentBuilder.parse("src/book.xml"); //4.获取指定标签名的元素,返回一个集合(在这里咱们知道做者这个标签是Element元素才进行强转) Element element = (Element) document.getElementsByTagName("做者").item(0); //5.获取属性值 String content = element.getAttribute("联系信息"); //6.打印 System.out.println(content); } //添加节点 @Test public void testJaxp4() throws Exception{ //1.建立工厂 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.获取DOM对象树的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文档,获取表明文档的Document对象 Document document = documentBuilder.parse("src/book.xml"); //4.建立标签 Element priceElement = document.createElement("售价"); //5.为标签体设置内容 priceElement.setTextContent("59"); //6.获得新建立的标签想要添加的位置 Node book = document.getElementsByTagName("书").item(0); //7.添加新建立的标签 book.appendChild(priceElement); //8.把更新后的内存中的document对象树从新写回xml文档里 Transformer transformer = TransformerFactory.newInstance().newTransformer(); Source xmlSource = new DOMSource(document); transformer.transform(xmlSource, new StreamResult(new FileOutputStream("src/book.xml"))); }