java基础——XML和DOM解析

学习了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、注释不可以嵌套
5CDATA区:是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();
===================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值