XML (一)
1 XML概述
- XML是指可扩展的标记语言,很类似与HTML。它被设计的宗旨就是描述数据,而非显示数据。
- XML标签没有被预定义,需要用户自定定义标签。
- XML技术是W3C组织发布的。目前遵循的规范是1.0规范。
- XML被广泛认为是继java之后在Internet上最激动人心的新技术。
2 XML技术能够解决什么问题?
- XML语言出现的根本目的就是在于描述数据。
- XML是一种通用的数据交换格式。
- 在XML语言中,允许yoghurt自定义标签。一个标签用于描述一段数据,一个标签有开始标签和结束表现,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,所以XML可以实现数据关系的描述。
- XML中的数据必须通过软件程序来解析和显示,这样的解析程序称为Parser解析器。
3 XML的常见应用
- 在java开发中,传统的配置文件是*.properties文件,而XML表示的数据更为丰富。
- XML技术除了用于描述有关系的数据外,还经常用于软件的配置文件,以描述程序模块之间的关系。
- 在一个软件系统中,通过XML配置文件可提供系统的灵活度,即程序的行为是通过XML文件来配置的,而不是硬编码。
4 XML的文档声明
- 在编写XML的时候,需要先使用文档声明来声明XML文档,且必须在第一行。
- 最简单的语法:<?xml version="1.0"?>
- 用encoding属性说明文件所使用的字符编码。
5 元素
- XML元素是指XML文件中出现的标签。一个标签分为起始和结束标签。
- 一个标签有若干个子标签,但所有标签必须合理的嵌套,不允许交叉嵌套。
- 一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或后代标签。
- XML中不会忽略主题内容中出现的空格和换行。
- 元素的名称可以包含字母、数字、减号、下划线和英文句点,但必须遵守下面的一些规范:
- 严格区分大小写
- 只能以字母或下划线开头
- 不能以XML或xml开头
- 名车字符之间不能有空格或制表符
- 名称字符之间不能使用冒号
6 属性
- 一个元素可以有多个属性,每个属性都有它自己的名称和取值。
- 属性值一定要用引号引起来。
- 属性名称的命名规范和元素的命名规范相同。
- 元素中的属性是不允许重复的。
- 在XML技术中,标签属性所代表的信息也可以被改为子元素的形式描述。
7 注释
- XML中的注释语法为:<!-- 这是注释 -->
- 注意:
- XML声明之前不能有注释。
- 注释不能嵌套。
8 特殊字符
特殊字符 | 替代符号 |
& | & |
< | < |
> | > |
" | " |
' | ' |
9 XML约束
9.1 为什么需要约束
- XML都是用户自定义的标签,如果出现小小的错误,软件程序将不能正确的获取文件中的内容而报错。
- XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档被称之为约束。
- 格式良好的XML:遵循XML语法的XML。
- 有效的XML:遵循约束文档的XML。
- 总之:
- 约束文档定义了在XML中允许出现的元素名称、属性和元素出现的顺序等等。
9.2 常用的约束技术
- DTD
- Schema
9.3 DTD
- DTD:Document Type Definition:文档类型定义。
- 作用:约束XML的书写规范。
- DTD文件的扩展名是.dtd
9.4 编写DTD的方式
9.4.1 直接打dtd的内容放在XML文件中
- 示例:
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> ]> <书架> <书> <书名>java从入门到放弃</书名> <作者>你好</作者> <售价>0.01</售价> </书> <书> <书名>c从入门到精通</书名> <作者>我好</作者> <售价>1.00</售价> </书> </书架>
9.4.2 dtd作为单独的文件存在
- book.dtd
<!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
- book.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE 书架 SYSTEM "book.dtd" > <书架> <书> <书名>java从入门到放弃</书名> <作者>你好</作者> <售价>0.01</售价> </书> <书> <书名>c从入门到精通</书名> <作者>我好</作者> <售价>1.00</售价> </书> </书架>
10 XML 的解析方式
- DOM
- SAX
11 java解析XML概述
- JAXP:开发包是JavaSE的一部分,它是由以下三个部分组成的:
- org.w3c.dom:提供DOM方式解析XML的标准接口
- org.xml.sax:提供SAX方式解析XML的标准接口
- javax.xml:提供了解析XML文档的类
- XML的解析开发包
- JAXP:是sun公司推出的解析标准实现。
- Dom4j:是开源组织推出的解析开发工具包。
12 使用JAXP进行DOM解析
- javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance()方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
- 获取JAXP中的DOM解析器
- ①调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。
- ②调用工厂对象的newDocumentBuilder()方法得到DOM解析器对象。
- ③调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象,这样就可以利用DOM特性对这个XML文档进行操作了。
- 示例:读取所有节点的名称
<?xml version='1.0' encoding='UTF-8'?> <书架> <书> <书名>java从入门到放弃</书名> <作者>你好</作者> <售价>0.01</售价> </书> <书> <书名>c从入门到精通</书名> <作者>我好</作者> <售价>1.00</售价> </书> </书架>
package com; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; /** * 2017/10/28 * 说明: */ public class JAXPDemo { public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { /* * 通过DocumentBuilderFactory获取解析器工厂 */ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); /** * 通过解析器工厂获取解析器 */ DocumentBuilder builder = builderFactory.newDocumentBuilder(); /** * 解析器解析xml获取document对象 */ Document document = builder.parse(new File("D:\\code\\web\\src\\main\\webapp\\book.xml")); Node book = document.getElementsByTagName("书架").item(0); if(book.getNodeType() == Node.ELEMENT_NODE){ Element e = (Element) book; getNode(e); } } private static void getNode(Node d) { if(d.getNodeType() == Node.ELEMENT_NODE){ System.out.print(d.getNodeName()+"\n"); } NodeList childNodes = d.getChildNodes(); for(int x = 0;x<childNodes.getLength();x++){ Node node = childNodes.item(x); getNode(node); } } }
- 示例:将书名是java从入门到放弃的作者改为呵呵
<?xml version='1.0' encoding='UTF-8'?> <书架> <书> <书名>java从入门到放弃</书名> <作者>你好</作者> <售价>0.01</售价> </书> <书> <书名>c从入门到精通</书名> <作者>我好</作者> <售价>1.00</售价> </书> </书架>
package com; import javafx.scene.transform.Transform; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * 2017/10/28 * 说明: */ public class JAXPDemo { public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, TransformerException { /* * 通过DocumentBuilderFactory获取解析器工厂 */ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); /** * 通过解析器工厂获取解析器 */ DocumentBuilder builder = builderFactory.newDocumentBuilder(); /** * 解析器解析xml获取document对象 */ Document document = builder.parse(new File("D:\\code\\web\\src\\main\\webapp\\book.xml")); Node authorNode = document.getElementsByTagName("作者").item(0); if(authorNode.getNodeType() == Node.ELEMENT_NODE){ Element authorElement = (Element) authorNode; authorElement.setTextContent("呵呵"); } TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("D:\\code\\web\\src\\main\\webapp\\book.xml"))); } }
XML (一)的更多相关文章
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- XML技术之DOM4J解析器
由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...
- UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)
最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...
- PHP中遍历XML之SimpleXML
简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.XML是当今用于传输数据的两大工具之一,另外一个是json. 我们在PHP中使用XML也是用来传输数据, ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
随机推荐
- MariaDB的"response time"插件
"响应时间"是衡量数据库性能的常用指标.在MariaDB中可以使用插件"QUERY_RESPONSE_TIME"来获取查询时间区间的统计信息. // 安装插 件 ...
- (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- Java压测之四两拨千斤
压测之四两拨千斤核心观念: 1.传统的http请求肯定不能用于压测,原因是请求一次,响应一次,而响应数据同时占用了客户端的带宽,故此,客户端请求后,不需要接受响应,让服务器单相思去. 2.寻找可以令服 ...
- CSS基础知识(display和visibility、overflow、文档流)
9.显示与隐藏 u display属性: (1)none:隐藏元素,不会再占有页面的任何空间,即不会影响布局. (2)inline:默认值.将元素[显示]为内联元素 (与HTML元素本身无关 ...
- Android Studio | 详细安装教程
Windows和Mac系统下的安装教程差不多,需要注意的是确保系统中已经安装了JDK,并且JDK版本为1.7或1.7以上版本,如果没有,请自行更新下载安装,地址如下: Java SE Develop ...
- HDU 2289 Cup【高精度,二分】
Cup Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- PL/SQL 实现行列转换
这篇博文写的是简单的行列转换的,以一个具体的例子来给出. 以前在论坛上有人问过相关的问题,上面的回答五光十色,有很多是可行的,当然更多的是自以为很高端,实际却不着边际的回答.下面进入正题. part1 ...
- html5 文本格式化
通常标签 <strong> 替换加粗标签 <b> 来使用, <em> 替换 <i>标签使用.然而,这些标签的含义是不同的:<b> 与< ...
- dede添加会员功能听语音
http://jingyan.baidu.com/article/363872ec36d33f6e4ba16fb7.html 其实 dede里面的 会员功能就是圈子模版啦 圈子 安装了 基本上有 1, ...
- Web API (四) 特性路由(Attribute Route)
特性路由 是Web API 2 中提出的一种新的类型的路由,正如其名称那样,它是通过特性(Attribute) 来定义路由的,相比之前的基于模式(Convertion Based)的路由,特性路由 能 ...