xml笔记

XML入门
 1.1 引入:
 
 HTML:负责网页结构
 CSS:负责网页样式(美观)
 Javascript:负责在路兰区端与用户进行交互
 
 负责静态的网页制作的语言
 
 HTML特点:
  1)有标签组成。<title><p><hr/><br/>
  2)语法结构松散的<p></p>  <p>  <p>
   大小写不区分
   结束标签和开始标签不一定匹配
   
  自定义标签可以把它们叫做xml标签
  
2 XML语法:
 
 xml文件以xml后缀名结尾
 xml文件需要使用xml解析器去解析。浏览器内置了xml解析器。
 
 2.1 标签
  
  语法:<student></student> 开始标签 标签体内容 结束标签
  1)<student/>或<student></student>空标签。没有标签体内容
  2)xml标签名称区分大小写
  3)xml标签一定要正确配对
  4)xml标签名中间不能使用空格
  5)xml标签名不能以数字开头
  6)注意:在一个xml文档中,有且仅有一个根标签
  
 2.2属性:
  语法:<Student neme="eric">student</Student>
  注意: 1)属性值必须以引号包含,不能省略,也不能单双引号混用
  2)一个标签内可以有多个属性,但不能出现重复的属性名
  
 2.3注释:
  语言:<!--  xml注释 -->
  
 2.4文档声明
 语法:<?xml version="1.0" encoding="utf-8"?>
 
 version:xml版本号
 encoding: 解析xml文件时查询的码表(解码过程时查询的码表)
 
 注意:
  1)如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文件
  2)如果用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存
  
 2.5转义字符:
  
  在xml中内置了一些特殊字符,这些字符不能直接被浏览器原样输出。如果希望把这些特殊字符按照原样输出到浏览器,对这些特殊字符进行转义。转义后的字符就叫转义字节。
  
   特殊字符   转义字符
   <   &It;
   >   &gt;
   "   &quot;
   &   &amp;
   空格  &nxbp;
   
 2.6 CDATA块
 作用:可以让一些需要进行包含特殊字符的内容同意进行原样输出。
 
 2.7 处理指令
  作用:告诉xml解析如果解析xml文档
  
  案例:<?xml-stylesheet type="tect/css" href="1.css"?>告诉xml计息该xml文档引用了哪个css样式
   需要提前xml内容可以是用xml-stylesheet指令指令
3XML解析
 3.1引入
 xml文件除了给开发者看,更多的情况使用程序读取xml文件的内容。这就叫做xml解析
 
 3.2XML解析方式(原理不同)
  DOM解析
  SAX解析
  
 3.3XML解析工具
  DOM解析原理:
   1)Sax解析工具(oracle-sun公司官方)
 3.4什么是DOM解析
  DOM加息原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
  
 3.5Dom4j工具
  非官方,不在jdk中
  
  使用步骤:
   1)导入domaj的和辛堡。dom4j-1.6.1.jar
   2)编写Dom4j读取xml文件代码
  public static void main(String[] args){
   try{
    //1.创建一个xml解析器对象
    SAXReader reader = new SAXReader();
    //2.读取xml文档,返回Document对象
    Document doc = reader.read(new File("文档路经"));
    sop()doc;
    catch(DocumentException e){
     e.printStackTrace();
     throw new RuntimeException(e);
    }
    }
  }  
 
 3.6Domj4读取xml文件
  节点:
   Iterator Element.nodeIterator();//获取当前标签节点下的u偶有子节点
  标签:
   Element Document.getRootElement();//获取xml文档的跟标签
   Element Element.element("标签名")//指定名称的第一个子标签
   Iterator<Element>Element.elementIterator("标签名");//指定名称的所有子标签
   List<Element> Element.elements();获取所有子标签
   
  属性:
   String Element.attributeValue("属性名");//获取指定名称的属性值
   
   Attibute  Element.attribute("属性名");//获取指定名称的属性对象
    Attibute.getName()//获取属性名称
    Attibute。getValue();//获取属性值
   List<Attibute>   Element.attributes();//获取所有属性对象
   
   Iterator.elementText("标签名")//获取当前标签的指定名称的子标签的文本内容
 
//1.读取xml文档,返回Document对象
  SAXReader reader = new SAXReader();
  Document doc = reader.read(new File("./src/contact.xml"));
2.获取跟标签
  Element rootElem = doc.getRootElement();
//3.得到标签名称
  String name = rootElem.getName();
4.得到当前标签下指定名称的第一个子标签
  Element contactElem = rootElem.element("contact");
5.得到当前标签下的所有指定名称的子标签
  Iterator<Element> it = rootElem.elementIterator("contact");
  while(it.hasNext()){
   Element elem = it.next();
   System.out.println(elem.getName());  
//6.得到当前标签下的所有子标签
  List<Element> list = rootElem.elements();
  //遍历List集合
  //方法:嵌套for 增强for 迭代器
  //嵌套for
  for(int i = 0; i<list.size(); i++){
   Element e = list.get(i);
   System.out.println(e.getName());
  }
  //增强for
  for(Element e : list){
   System.out.println(e.getName());
  }
//7.将xml文件信息封装到对象中
  List<contact> list = new ArrayList<contact>();
  
  //读取xml封装对象
  SAXReader reader = new SAXReader();
  Document doc = reader.read(new File("./src/contact.xml"));
  //读取跟标签
  Iterator<Element> it = doc.getRootElement().elementIterator();
  while(it.hasNext()){
   Element elem = it.next();
   //创建contact对象
   contact contact = new contact();
   contact.setId(elem.attributeValue("id"));
   
   contact.setName(elem.elementText("name"));
   contact.setAge(elem.elementText("age"));
   contact.setPhone(elem.elementText("phone"));
   contact.setEmail(elem.elementText("email"));
   contact.setQq(elem.elementText("qq"));
   list.add(contact);
  }
  
  for(contact contact : list){
   System.out.println(contact);
  }
  
  contact contact = new contact();
  
 }
 
Dom4j修改xml文档
  2.1 写出内容到xml文档
    XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
    wirter.write(Document);
  2.2 修改xml文档的API
   增加:
     DocumentHelper.createDocument()  增加文档
     addElement("名称")  增加标签
     addAttribute("名称",“值”)  增加属性
   修改:
     Attribute.setValue("值")  修改属性值
     Element.addAtribute("同名的属性名","值")  修改同名的属性值
     Element.setText("内容")  修改文本内容
   删除
     Element.detach();  删除标签 
     Attribute.detach();  删除属性 
 

4.2 SAX解析工具

SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

 

核心的API

   SAXParser类: 用于读取和解析xml文件对象

parseFile f, DefaultHandler dh)方法: 解析xml文件

 

参数一: File:表示 读取的xml文件。

    参数二: DefaultHandlerSAX事件处理程序。使用DefaultHandler的子类

例如:{

      1.创建SAXParser对象  

              SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

                  2.调用parse方法

parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

} [一个类继承class 类名(extends DefaultHandler  在调用是创建传进去

 

DefaultHandler类的API:

void startDocument()  :  在读到文档开始时调用

void endDocument()  :在读到文档结束时调用

void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用

void endElement(String uri, String localName, String qName)   :读到结束标签时调用

void characters(char[] ch, int start, int length)   读到文本内容时调用

 

 

                                 ============DOM解析  vs   SAX解析===========

 

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(NodeElementAttribute,Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

总结:

1Dom4j修改xml文档

 new XMLWrier();

......

2xPath技术: 快速查询xml节点

selectNodes()

selectSinglNode();

xpath表达式语言

3)  SAX解析

SAXParser parse

parser()

DefaultHandler类:

startElement();

characters();

endElement();

 

posted @ 2021-03-09 19:53  wbnsyw  阅读(57)  评论(0)    收藏  举报