学习了XML:是什么?有什么特点?怎么使用?什么时候用?
XML是可扩展的标记语言,类似于HTML但是他的设计是用来描述数据的而不是显示数据的,HTML是用来显示数据的,他的标记没有被定义,所以要使用者自己定义,标记分为开始标记和结束标记,结束标记不可以省略,在开始和结束标记之间还可以嵌套其他的标记,但是不可以交叉嵌套,一般用来做软件的配置文件使用,在书写的时候要注意书写规范。
1、文档声明:也就是要在第一行写声明(必须是第一行),格式是:<?xml version=“1.0”encoding=“UTF-8”?>还有一个属性是standalone,用来说明文档是否独立,standalone=“yes”
2、属性:一个xml文档只能有一个跟标签,其他的标签都是他的子标签或孙标签,而且标签出现的空格和换行xml解析程序都会当作标签的内容进行处理
命名规范:1、严格区分大小写
2、不能以数字或_(下划线)开头
3、不能以XML(xml或Xml等)开头
4、不能包含空格
5、名称中间不能包含冒号(:)(冒号有特殊的用途)
3、属性:每一个标签都有自己的属性,每一个属性都有自己的名称和取值,属性值要用单引号或双引号引起来,最好使用双引号,因为双引号里面可以嵌套单引号
4、注释:格式<! - - 注释 - ->
注意:1、在文档声明之前不能有注释
2、注释不可以嵌套
5、CDATA区:是Character Data的缩写
作用:把标签当作普通文本内容
语法:<! [ CDATA[内容]]>
例:< ! [ CDATA[<itcast>liwen</itcast>]]>
6、处理指令:简称PI(Processing Instruction)
作用:用来指挥软件如何解析XML文档
常用的指令:xml声明、xml-stylesheet指令
xml-stylesheet指令常用来关联css样式,例:
<?xml-stylesheettype=“text/css” href=“some.css”?>
XML约束
常见的xml约束有XML DTD和XML Schema
XML用来约束文档的书写规范,规定了文档中出现的元素名称。属性以及元素出现的顺序等等
DTD约束:两种格式
采用本地的DTD文档格式:<!DOCTYPE 跟元素 SYSTEM “DTD文档路径”>
采用网络上的文档格式:<! DOCTYPE 跟元素 PUBLIC “DTD名称” “文档URL”>
在DTD文档中使用ELEMENT声明一个XML元素,
格式:<!ELEMENT 元素名称 元素类型>
元素的类型可以为元素的内容或者类型
若为元素内容,则需要使用()括起来:
<!ELEMENT 书(书名,作者,售价)>
<!ELEMENT 书名(#PCDATA)>
若为元素类型,就直接书写,DTD规范了几种类型:
EMPITY :用来定义空元素
ANY:表示元素内容为任意类型
属性定义(attribute):
语法格式:<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名1 属性值类型 设置说明
……………………
>
属性声明举例:<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
对应的XML文件:
<商品 类别="服装" 颜色="黄色">…</商品>
<商品 类别="服装">…</商品>
设置说明:1、#REQUIRED:必须设置该属性
2、#IMPLIED:可以设置也可以不设置
3、#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属 性设置其它值。但需要为该属性提供这个值
4、直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若 没设置则使用默认值。但需要为该属性提供这个值
常用属性值类型:
CDATA(表示为普通文本字符串)、ENUMERATED、ID、ENTITY(实体)
===================================================
DOM解析:dom解析可以直接获取要解析的节点的名称,直接使用,适合做增删改
===================================================
//获取factory对象
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
//获取documentBuilder对象
DocumentBuilder builder =factory.newDocumentBuilder();
//将文件映射为document对象
Document document =builder.parse("src/book.xml");
当文件被修改了需要重新写入的话要使用转换工厂
// 获取转换工厂
TransformerFactory factory2 = TransformerFactory.newInstance();
// 获取转换方法
Transformertransformer = factory2.newTransformer();
// 将值写到目的地
transformer.transform(new DOMSource(document), newStreamResult("src/book.xml"));===================================================
SAX 解析:MyContenthandler()这个方法是要自己定义的,可以实现Contenthandler接口,然后复写全部方法,但是这个有局限性就是我们不需要的方法也要复写,所以我们可以采用第二种方法,继承DefaultHandler类,只实现自己所需要的方法即可,适合做查找
===================================================
//获得解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//获取解析器
SAXParser parser =factory.newSAXParser();
//获取读取xml内容的reader对象
XMLReader reader =parser.getXMLReader();
//设置一个事件
reader.setContentHandler(newMyContenthandler());
//设置要解析的文件
reader.parse("src/book.xml");
===================================================
DOM4J 解析:DOM4J如果要获得某一个节点(元素)必须要先获得他的父类节点,不可以直接获取某一个节点,而且需要导入dom4j文件
===================================================
//获取解析器对象
SAXReader reader = new SAXReader();
//获取代表xml文档的document对象
Document document =reader.read("src/book.xml");
当文件被修改后需要重新写入的话要使用流来完成
// 将 内存中的document 对象重新写回到 xml 文件中.
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(newFileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
===================================================