JavaWeb

来源:互联网 发布:天互数据 图片 编辑:程序博客网 时间:2024/05/19 01:33

1.XML的简介

  • eXtensible Markup Language:可扩展标记型语言
    • 标记型语言:html是标记型语言,xml也是标记型语言,使用标签来操作
    • 可扩展
      • html里面的标签是固定的,每个标签都有特定的含义 <h1> <br/> <hr/>
      • 标签可以自己定义,可以写中文的标签 <person></person>、<猫></猫>
  • xml用途
    • html是用于显示数据,xml也可以显示数据(不是主要功能)
    • xml主要功能,为了存储数据
  • xml是w3c组织发布的技术
  • xml有两个版本1.0和1.1。现在使用的都是1.0版本,1.1版本不能向下兼容

2.XML的应用

  • 不同系统之间传输数据
    • QQ之间数据的传输
    • 画图分析过程
  • 用来标识生活中有关系的数据
  • 经常用在文件配置
    • 比如现在连接数据库,肯定知道数据库的用户名和密码,数据名称
    • 如果要修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了

3.XML的语法

1.xml的文档声明

  • 创建一个文件,后缀名是 .xml
  • 如果写xml,第一步,必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)
    <?xml version=”1.0” encoding=”gbk”?>
    文档声明必须写在第一行第一列
    • version:xml的版本 1.0(使用) 1.1
    • encoding:xml编码 gbk utf-8 is8859-1(不包含中文)
    • standalone:是否需要依赖其他文件 yes/no
<?xml version="1.0" encoding="gbk"?><person>    <name>zhangsan</name>    <age>20</age></person>
  • xml的中文乱码问题解决
    这里写图片描述
    只要将保存时的编码和设置打开时候的编码(文档声明中的encoding)一致,就不会出现乱码问题

2.定义元素(标签)
3.定义属性
4.注释
5.特殊字符
6.CDATA区(了解)
7.PI指令(了解)

4.XML的元素定义

标签定义:

  • 标签定义有开始必须有结束:<person></person>
  • 标签没有内容,可以在标签内结束<aa/>
  • 标签可以嵌套,但必须要合理嵌套
    • 合理嵌套:<aa><bb></bb></aa>
    • 不合理嵌套:<aa><bb></aa></bb>
  • 一个xml中,只能有一个根标签,其他标签都是这个标签下面的标签
  • 在xml中把空格和换行都当成内容来解析
    • 下面这两端代码含义是不一样的
    • <aa>11111111</aa>
    • <aa>
      111111111
      </aa>
  • xml中标签的名称规则
    • xml代码区分大小写:<p><P>这两个标签是不一样的
    • xml的标签不能以数字和下划线开头<2a><_aa>
    • xml的标签不能以xml、XML、Xml等开头<xmla><XmlB><XMLC>
    • xml的标签不能包含空格和冒号<a b><b:c>

5.XML的属性的定义

  • html是标记型文档,可以有属性
  • xml也是标记型文档,也可以有属性
  • <person id1=”aaa” id2=”aaa”></person>
  • 属性定义的要求:
    • 一个标签上可以有多个属性<person id1=”aaa” id2=”aaa”></person>
    • 属性名称不能相同:<person id1=”aaa” id1=”aaa”></person>这个是不正确的
    • 属性名称和属性值之间使用=,属性值使用引号(可以是双引号,也可以是单引号)
    • xml属性的名称规范和元素的名称规范一致

6.XML的注释

  • 写法:<!- - xml的注释 - ->
  • 注意:注释不能嵌套
  • 注释不能放到第一行,第一行第一列必须放文档声明

7.xml中的特殊字符

  • 如果想要在xml中显示a<b,不能正常显示,因为把<当做标签
  • 如果想要显示,需要对特殊字符进行转义

8.XML的CDATA区

可以解决多个字符都需要转义的操作 if(a<b && b<c && d>f) {}
把这些内容放到CDATA区里面,就不需要转义了
写法:
<![CDATA[ 内容 ]]>
<![CDATA[ <b>if(a<b && b<c && d>f)</b> ]]>
把特殊字符当做文本内容,而不是标签

9.XML的PI指令

  • 可以在xml中设置样式
  • 写法:<?xml-stylesheet type=”text/css” href=”css的路径”?>
    <?xml-stylesheet type=”text/css” href=”1.css”?>
  • 不能放在第一行

10.XML的约束

为什么需要约束?

<?xml version="1.0" encoding="utf-8"?><person>    <name>zhangsan</name>    <age>20</age>    <>10000</></person>

比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name,age等,但是如果在xml文件中写了一个标签<猫>,发现可以正常显示,因为符合语法规范,但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来规定xml这种智能出现的元素,在这个时候就需要约束。
xml的约束的技术:

  • dtd约束
  • schema约束(看懂)

11.DTD的快速入门

创建一个文件,后缀名 .dtd
(1)看xml中有多少个元素,有几个元素,在dtd文件中写几个 <!ELEMENT>
(2)判断元素是简单元素还是复杂元素

  • 复杂元素:有子元素的元素
    <ELEMENT 元素名称 (子元素)>
  • 简单元素:没有子元素
    <ELEMENT 元素名称 (#PCDATA)>

(3)需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径”>

  • 打开xml文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束
  • 如果想要校验xml的约束,需要使用工具(eclipse工具)

1.dtd:

<!ELEMENT person(name,age)><!ELEMENT name(#PCDATA)><!ELEMENT age(#PCDATA)>

1.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE person SYSTEM "1.dtd"><person>    <name>zhangsan</name>    <age>20</age>    <!-- <a>111</a> 这里会报错 --></person>

12.DTD的三种引入方式

  • 引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
  • 使用内部的dtd文件(在xml文件内编写DTD)
<!DOCTYPE 根元素名称 [    <!ELEMENT person (name,age)>    <!ELEMENT age (#PCDATA)>    <!ELEMENT age (#PCDATA)>]>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE person[    <!ELEMENT person (name,age)>    <!ELEMENT age (#PCDATA)>    <!ELEMENT age (#PCDATA)>]>
  • 使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

后面学到框架struts2使用配置文件,使用的就是外部的dtd文件

<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">

13.使用DTD定义元素

  • 语法:<!ELEMENT 元素名 约束>
  • 简单元素:<!ELEMENT name (#PCDATA)>
    • (#PCDATA):约束name是字符串类型
    • EMPTY:元素为空(没有内容)<sex></sex>
    • ANY:任意
  • 复杂元素:<!ELEMENT 元素名称 (子元素)>
    • <!ELEMENT person (name,age,sex,school)>子元素直接使用逗号隔开,表示子元素只能出现一次,并且子元素出现的顺序只能按照这个顺序
      • +:表示子元素出现一次或者多次
      • ?:表示子元素出现零次或者一次
      • *:表示任意次
    • <!ELEMENT person (name|age|sex|school)>子元素使用 | 隔开,表示子元素只能出现其中的任意一个

1.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE person [    <!ELEMENT person (name+,age?,sex*,school)>    <!ELEMENT name (#PCDATA)>    <!ELEMENT age (#PCDATA)>    <!ELEMENT sex EMPTY>    <!ELEMENT school ANY>]><person>    <name>zhangsan1</name>    <name>zhangsan2</name>    <name>zhangsan3</name>    <age>20</age>    <sex></sex>    <sex></sex>    <school>11111</school></person>

14.使用DTD定义属性

语法:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>

属性类型:
- CDATA:字符串
- 枚举:表示在一定的范围内出现值,但是只能每次出现其中的一个
- ID:值只能是字母或者下划线开头

属性约束:
- #REQUIRED:属性必须存在
- #IMPLIED:属性可有可无
- #FIXED:表示一个固定值,属性的值必须是设置的这个固定值
<!ATTLIST sex
ID4 CDATA #FIXED “ABC”
>
- 直接值:不写属性,使用直接值作为默认值;写了属性,使用设置的值
<!ATTLIST school
ID5 CDATA “WWW”
>

1.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE person [    <!ELEMENT person (name+,age?,sex*,school,birthday)>    <!ELEMENT name (#PCDATA)>    <!ATTLIST name        ID3 ID #REQUIRED    >    <!ELEMENT age (#PCDATA)>    <!ATTLIST age        ID2 (AA|BB|CC) #IMPLIED    >    <!ELEMENT sex (#PCDATA)>    <!ATTLIST sex        ID4 CDATA #FIXED "ABC"    >    <!ELEMENT school ANY>    <!ELEMENT birthday (#PCDATA)>    <!ATTLIST birthday        ID1 CDATA #REQUIRED    >]><person>    <name ID3="aaa2">zhangsan1</name>    <name ID3="_aa">zhangsan2</name>    <age ID2="AA">20</age>    <sex ID4="ABC"></sex>    <school>11111</school>    <birthday ID1="AAA">2015</birthday></person>

15.实体

语法:<!ENTITY 实体名称 “实体的值”>
使用实体:&实体名称
1.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE person [    <!ELEMENT person (name)>    <!ELEMENT name (#PCDATA)>    <!ATTLIST name        ID3 ID #REQUIRED    >    <!ENTITY test "hahahehe">]><person>    <name ID3="aaa2">&test;</name></person>

16.XML解析

xml是标记型文档
js使用dom解析标记型文档:

  • 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
  • document对象、element对象、属性对象、文本对象、Node节点对象

XML解析有两种方式:dom和sax
这里写图片描述

想要解析xml,首先需要解析器
不同的公司和组织提供了不同的针对dom和sax方式的解析器,通过api方式提供

  • sun公司提供了针对dom和sax的解析器:jaxp
  • dom4j组织提供了针对dom和sax的解析器:dom4j
  • jdom组织提供了针对dom和sax的解析器:jdom

17.jaxp的api的查看

jaxp是javase的一部分
jaxp解析器在javase的jdk的javax.xml.parsers包里面
javax.xml.parsers包中包含四个类:分别针对dom和sax解析使用的类

  • dom
    • DocumentBuilder:解析器类
      这个类是一个抽象类,不能new
      它的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
      DocumentBuiler类方法:
      • parse(“xml路径”):可以解析xml,返回Document整个文档。返回的document是一个接口,它的父接口是Node。
        • Document接口的方法:
        • getElementsByTagName(String tagname):可以得到标签,返回集合NodeList,遍历NodeList就可以得到Node
          • NodeList接口的方法:
          • getLength():得到集合的长度
          • item(int index):下标取到的具体的值,返回一个Node类型的值
            • Node接口的方法
            • getTextContent():得到标签里面的内容
        • createElement(String tagName):创建标签
        • createTextNode(String date):创建文本
        • appendChild(Node newChild):把文本添加到标签下面(父接口Node中的方法)
        • removeChild(Node oldChild):删除节点(父接口Node中的方法)
        • getParentNode():获取父节点(父接口Node中的方法)
        • -
    • DocumentBuilderFactory:解析器工厂
      这个类也是一个抽象类,不能new
      可以通过静态方法newInstance()获取DocumentBuilderFactory的实例
  • sax
    • SAXParser:解析器类
    • SAXParserFactory:解析器工厂

18.使用jaxp实现查询操作

步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml返回document对象
4.得到所有的name元素的NodeList集合
5.返回集合,遍历集合,得到每一个name元素

person.xml:

<?xml version="1.0" encoding="UTF-8"?><person>    <p1>        <name>zhangsan</name>        <age>20</age>    </p1>    <p1>        <name>lisi</name>        <age>30</age>    </p1></person>

TestJaxp.java

public class TestJaxp {    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {         //1.创建解析器工厂        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        //2.根据解析器工厂创建解析器        DocumentBuilder builder = factory.newDocumentBuilder();        //3.解析xml返回document对象        Document document = builder.parse("src/person.xml");        //4.得到所有的name元素的NodeList集合        NodeList nodeList = document.getElementsByTagName("name");        5.返回集合,遍历集合,得到每一个name元素        for(int i = 0; i < nodeList.getLength(); i++){            Node node = nodeList.item(i);            System.out.println(node.getTextContent());        }    }}

19.使用jaxp添加节点

目标:在第一个p1下面添加<sex>nv<sex>
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml,返回document
4.使用 item(int index)方法得到第一个p1
5.使用createELement创建sex标签
6.使用createTextNode创建文本
7.使用appendChild把文本添加到sex下面
8.把sex添加到第一个p1下面
9.因为我们这时候操作的其实是内存中的dom树,所以还需要把内容中的数据回写到硬盘上的xml文件

TestJaxp.java

public class TestJaxp {    public static void main(String[] args) throws Exception {        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        DocumentBuilder builder = factory.newDocumentBuilder();        Document document = builder.parse("src/person.xml");        NodeList nodeList = document.getElementsByTagName("p1");        Node p1 = nodeList.item(0);        Element sexEle = document.createElement("sex");        Text textEle = document.createTextNode("nv");        sexEle.appendChild(textEle);        p1.appendChild(sexEle);        //回写        TransformerFactory transFormerFactory = TransformerFactory.newInstance();        Transformer transformer = transFormerFactory.newTransformer();        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));    }}

20.使用jaxp修改节点

步骤:使用setTextContent方法

public class TestJaxp {    public static void main(String[] args) throws Exception {        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        DocumentBuilder builder = factory.newDocumentBuilder();        Document document = builder.parse("src/person.xml");        NodeList nodeList = document.getElementsByTagName("sex");        Node sexEle = nodeList.item(0);        //调用setTextContent方法修改节点内容        sexEle.setTextContent("nan");        //回写        TransformerFactory transFormerFactory = TransformerFactory.newInstance();        Transformer transformer = transFormerFactory.newTransformer();        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));    }}

21.使用jaxp删除节点

步骤:
获取要删除的节点
获取要删除节点的父节点
调用父节点的removeChild方法删除节点
回写

public class TestJaxp {    public static void main(String[] args) throws Exception {        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        DocumentBuilder builder = factory.newDocumentBuilder();        Document document = builder.parse("src/person.xml");        //得到要删除的sex节点        Node sexEle = document.getElementsByTagName("sex").item(0);        //sex节点的父节点        Node parentEle = sexEle.getParentNode();        //调用父节点的removeChile()方法        parentEle.removeChild(sexEle);        //回写        TransformerFactory transFormerFactory = TransformerFactory.newInstance();        Transformer transformer = transFormerFactory.newTransformer();        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));    }}

22.使用jaxp遍历所有节点

思想:递归
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml,返回document
使用递归:
4.得到根节点
5.得到根节点的子节点
6.得到根节点的子节点的子节点

public class TestJaxp {    public static void main(String[] args) throws Exception {        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        DocumentBuilder builder = factory.newDocumentBuilder();        Document document = builder.parse("src/person.xml");        list(document);    }    public static void list(Node node) {        //判断是元素类型的时候才打印        if(node.getNodeType() == Node.ELEMENT_NODE){            System.out.println(node.getNodeName());        }        //得到一层子节点        NodeList nodeList = node.getChildNodes();        for(int i=0; i<nodeList.getLength(); i++){            Node node1 = nodeList.item(i);            list(node1);        }    }}

23.schema的开发过程

开发步骤:

  • XSD:

1)创建一个schema文件,后缀名是 .xsd,它其实也是一个xml,它的根节点是<schema>

1.schema标签的属性:
①xmlns=”http://www.w3.org/2001/XMLSchema”:固定值,表示当前xml文件是一个约束文件
②targetNamespace=”http://www.example.org/1”:在xml文件中使用这个地址来引入约束文件,什么值都可以,但为了防止重复一般使用url地址
③elementFormDefault=”qualified”:表示可用

2.schema标签中的内容:
①看xml中有多少个元素,有几个元素就有几个<element>
②看简单元素和复杂元素
如果是复杂元素

<element name="">    <complexType>        <sequence>            子元素        </sequence>    </complexType></element>

如果是简单元素,就写在复杂元素的<squence>标签中

<element name="">    <complexType>        <sequence>            <element name="" type=""></element>        </sequence>    </complexType></element>
  • XML:
    在xml文件中引入约束文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://www.example.org/1"    xsi:schemaLocation="http://www.example.org/1 1.xsd"></person>
  • xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” :表示xml是一个被约束文件,其中xsi是名称空间,类似于包的作用,用于区分导入的不同的xmlns。如果想使用不同约束文件中的元素就用<名称空间:元素>来使用
  • xmlns=”http://www.example.org/1”:是.xsd约束文件中的targetNamespace
  • xsi:schemaLocation=”http://www.example.org/1 1.xsd”:targetNamespace 空格 约束文档的地址路径

这里写图片描述

示例:
1.xsd:

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/1" xmlns:tns="http://www.example.org/1" elementFormDefault="qualified">    <element name="p1">        <complexType>            <sequence>                <element name="name" type="string"></element>                <element name="age" type="int"></element>            </sequence>        </complexType>    </element></schema>

person.xml:

<?xml version="1.0" encoding="UTF-8"?><person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://www.example.org/1"    xsi:schemaLocation="http://www.example.org/1 1.xsd">    <p1>        <name>zhangsan</name>        <age>20</age>    </p1>    <p1>        <name>lisi</name>        <age>30</age>    </p1></person>

24.schema的约束的api

XMLSchema复杂元素指示器:
- ALL:表示只能出现一次
- Choice:只能出现其中的一个
- Sequence:元素按照顺序出现
- maxOccurs=”unbounded”表示出现次数没限制
<element name=”name” type=”double” maxOccurs=”unbounded”/>
- 定义属性(必须是复杂元素):<attribute name=”p1” type=”string” user=”required”></attribute>
写在</complexType>之前,name:属性名称,type:属性类型,use:属性是否必须出现
- <any></any>:表示任意元素

25.使用sax解析xml的过程

解析xml有两种技术:dom和sax
使用sax解析方式:事件驱动,边读边解析
在javax.xml.parsers包中有两个类

  • SAXParser:
    这个类的实例可以从SAXParserFactory.newSAXParser()方法获得
    parser(File f, DefaultHandler db):第一个参数是xml的路径,第二个参数是一个事件处理器
  • SAXParserFactory:
    这个类的实例可以由newInstance()方法得到

画图分析sax的执行过程:
这里写图片描述
当解析到开始标签的时候,自动执行startElement方法
当解析到文本的时候,自动执行characters方法
当解析到结束标签的时候,自动执行endElement方法

26.使用jaxp的sax方式解析xml

sax方式不能实现增删改操作,只能做查询操作

例1:打印出整个文档
执行parse方法,第一个参数xml路径,第二个参数是一个事件处理器
创建一个类,继承事件处理器的类,重写里面的三个方法
Person.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>    <p1>        <name>zhangsan</name>        <age>20</age>    </p1>    <p1>        <name>lisi</name>        <age>30</age>    </p1></person>

SAXTest.java:

public class SAXTest {    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();        SAXParser saxParser = saxParserFactory.newSAXParser();        saxParser.parse("src/person.xml", new MyDefaultHandler());    }}class MyDefaultHandler extends DefaultHandler{    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        System.out.print("<" + qName + ">");    }    public void endElement(String uri, String localName, String qName)            throws SAXException {        System.out.print("<" + qName + ">");    }    public void characters(char[] ch, int start, int length)            throws SAXException {        System.out.print(new String(ch, start, length));    }}

例2:打印出所有name

class MyDefaultHandler2 extends DefaultHandler{    boolean flag = false;    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        //判断qName是否是name元素        if(qName.equals("name")){            flag = true;        }    }    public void endElement(String uri, String localName, String qName)            throws SAXException {        //把falg的值变成false        if(qname.equals("name")){            flag = false;        }    }    public void characters(char[] ch, int start, int length)            throws SAXException {        //当flag的值是true的时候,表示解析到name元素        if(flag){            System.out.println(new String(ch, start, length));        }    }}

例3:获取第一个name
思路:添加一个index=1,当index==1的时候打印name

27.使用dom4j解析xml

dom4j是一个组织,针对xml解析,提供解析器 dom4j
dom4j不是javase的一部分,想要使用需要导入dom4j的jar包

  • 得到document:
    SAXReader reader = new SAXReader();
    Document document = reader.read(url);
  • Document接口中的方法:
    getRootElement():获取根节点,返回Element
  • Element接口中的方法:
    element(String qname):表示获取标签下面的第一个字标签,qname是字标签的名称
    elements(String qname):获取标签下面所有该名称的字标签
    elements():获取标签下面的所有一层字标签
    getText():获取标签的内容
    getParent():获取父节点
    addElement():添加标签

28.使用dom4j实现查询xml操作

例1:查询所有name元素里面的值

public static void selectAll() throws Exception {        //创建解析器        SAXReader saxReader = new SAXReader();        //得到document        Document document = saxReader.read("src/person.xml");        //得到根节点        Element root = document.getRootElement();        List<Element> list = root.elements("p1");        for(Element element : list){            Element nameEle = element.element("name");            //得到name里面的值            System.out.println(nameEle.getText());        }

例2:查询第一个name元素里面的值

    public static void selectFirst() throws Exception {        //创建解析器        SAXReader saxReader = new SAXReader();        //得到document        Document document = saxReader.read("src/person.xml");        //得到根节点        Element root = document.getRootElement();        Element p1 = root.element("p1");        Element name = p1.element("name");        System.out.println(name.getText());    }}

29.使用dom4j添加节点

例1:在第一个p1的age节点下面添加sex节点
步骤:
1.创建解析器
2.得到document
3.得到根节点

4.获取第一个p1:使用element方法
5.在p1下面添加元素:以前使用jaxp的时候需要先创建元素,再添加到父元素上,使用dom4j不需要创建,直接使用addElement(“标签名称”)方法添加即可,返回一个Element
6.在添加完成之后的元素下面添加文本:使用setText(“文本内容”)方法
7.回写xml

  • 格式化OutputFormat
    • 使用createPrettyPrint方法,表示一个漂亮的格式
    • 使用createCompactFormat方法,表示一个紧凑的格式
  • 使用类XMLWriter,直接new这个类,传递两个参数
    • 第一个参数是xml文件路径 new FileOutputStream(“路径”)
    • 第二个参数是格式化类型的值
    public static void addElement() throws Exception {        // TODO Auto-generated method stub        SAXReader reader = new SAXReader();        Document document = reader.read("src/person.xml");        Element root = document.getRootElement();        //获取p1节点        Element p1 = root.element("p1");        //在p1下面添加sex节点        Element sex = p1.addElement("sex");        //在sex下面添加文本        sex.setText("nv");        //回写xml        OutputFormat format = OutputFormat.createPrettyPrint();        XMLWriter writer = new XMLWriter(new FileOutputStream("src/person.xml"), format);        writer.write(document);        writer.close();    }

例2:在指定位置添加节点。第一个p1的age节点上添加school节点

    public static void addSchool() throws Exception {        SAXReader reader = new SAXReader();        Document document = reader.read("src/person.xml");        Element root = document.getRootElement();        Element p1 = root.element("p1");        List<Element> list = p1.elements();        //创建元素,使用DocumentHelper帮助类        Element school = DocumentHelper.createElement("school");        //在school下面创建文本        school.setText("ecit");        //在特定位置添加        list.add(1, school);        //回写        OutputFormat format = OutputFormat.createPrettyPrint();        XMLWriter writer = new XMLWriter(new FileOutputStream("src/person.xml"), format);        writer.write(document);        writer.close();    }

30.使用dom4j修改节点内容

使用Element接口中的setText()方法
回写

31.使用dom4j删除节点

使用Element接口中的getParent()方法获取到父节点,然后调用父节点的remove(Element element)方法删除节点
回写

31.使用dom4j获取节点的属性值

使用Element接口的attributeValue(String arg)方法获取属性值
person.xml:

<?xml version="1.0" encoding="UTF-8"?><person xmlns="http://www.example.org/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/1 1.xsd">    <p1 id="aaa">     <name>zhangsan</name>      <school xmlns="">ecit</school>    <age>20</age>      <sex>nv</sex>   </p1>    <p1>     <name>lisi</name>      <age>30</age>   </p1> </person>

TestDom4j.java:

    public static void getValue() throws Exception {        // TODO Auto-generated method stub        SAXReader reader = new SAXReader();        Document document = reader.read("src/person.xml");        Element root = document.getRootElement();        Element p1 = root.element("p1");        System.out.println(p1.attributeValue("id"));    }

32.使用dom4j支持xpath的操作

  • /AAA/BBB/DDD:表示AAA下面的BBB下面的DDD
  • //BBB:表示只要名称是BBB的
    • //DDD/BBB:表示只要父元素是DDD的BBB元素
  • *表示所有元素
    • /AAA/CCC/DDD/*
    • ⁄∗⁄∗⁄∗⁄BBB
  • /AAA/BBB[1] :表示AAA下面的第一个BBB
    • /AAA/BBB[last()]:表示AAA下面的最后一个BBB
      -//BBB[@id]:表示有id属性的BBB
      //BBB[@id=’b1’]:表示元素名称是BBB,并且在BBB上有id为b1的元素

33.使用dom4j支持xpath的具体操作

默认的情况下,dom4j不支持xpath
如果想要在dom4j里面支持xpath,需要引入支持xpath的jar包:jaxen-1.1-beta-6.jar
在dom4j里面提供了两个方法用来支持xpath
- selectNodes(“xpath表达式”):获取多个节点
- selectSingleNode(“xpath表达式”):获取一个节点