xml

普通数据区CDATA:<![CDATA[ 内容 ]]>

PI指令:通过<?xml-stylesheet type = "text/css" href = "地址"?> 可以引入css样式

xml的约束  dtd约束、schema约束

 dtd约束

一个xml中只能有一个dtd约束文件

元素定义:<!ELEMENT 元素名 约束>

约束类型:

对于简单元素

(#PCDATA)字符串、EMPTY空、ANY任意

对于复杂元素

元素名 (子元素1+,子元素2?,子元素3*,子元素4|子元素5),其中逗号表示出现顺序,+为至少一次,?表示有或没有,*表示任意次,默认表示只能一次,|表示其中的一个

属性定义:<!ATTLIST 元素名

          属性名  属性类型  约束>

属性类型:CDATA 字符串、枚举 没有关键字 用A|B|C表示、ID  只能时字母或者下划线开头

约束类型:#REQUIRED 该属性必须出现、#IMPLIED 该属性可以不出现、#FIXED "" 表示该属性为一个固定值 可以使|、直接值  如果不写默认为该值

定义实体:<!ENTITY TEST "值" >、通过&TEST;引用该实体,需要在内部dtd中使用

dtd的引入方式外部文件、xml文件中、网络url

外部文件格式

<!ELEMENT 元素名 约束>

<!ELEMENT 元素名 约束>

<!ELEMENT 元素名 约束>

……

引入方式:<!DOCTYPE 根元素名称 SYSTEM ”dtd路径“>

xml文件中的格式

<!DOCTYPE 根元素名 [

 

<!ELEMENT 元素名 约束>

 

<!ELEMENT 元素名 约束>

 

<!ELEMENT 元素名 约束>

 

……

 

]>

 

schema约束

 符合xml语法,一个xml中可以有多个schema约束,通过namespace区分,可以指定更具体的类型,非常强大,但是语法复杂

约束文件text.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns = "http://www.w3.org/2001/XMLSchema" 代表当前是一个约束文件 -->
<!-- targetNamespace="http://www.xiao.com/2015020"表示这个约束文件的地址 -->
<schema xmlns = "http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.xiao.com/2015020"
        elementFormDefault="qualified">//
        <element name="person">
            <complexType>//复杂元素
                <sequence>// <sequence>表示按照顺序,<all> 表示只能出现一次,<choice>表示只能是其中一个,<any>表示任意
                    <element name="name" type="string" maxOccurs = "unbounded"></element>maxOccurs表示出现次数,unbounded表示无限次
                    <element name="age" type = "int"></element>
                </sequence>
          <attribute name = "" type = "" use = ""></attribute>
</complexType> </element> </schema>

使用约束文件:

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"//说明是一个被约束文件,用xsi代表一个命名空间,可以自定义名字
        xmlns = "http://www.xiao.com/2015020"//约束文件地址
        xsi:schemaLocation="http://www.xiao.com/2015020 text.xsd">
    <name>"beautiful"</name>
    <age>29</age>
</person>

 

 

xml解析方式

DOM方式 和  SAX方式

解析器:jaxp、dom4j

DOM:

 jaxp解析器的两个抽象类:

DocumentBuilder:解析器类

DocumetnBuilderFactory:解析器工厂

四个接口:

Document:代表整个文档的对象

Element:一个元素对象

Node:一个节点对象,整个文档由多个节点构成

Attr:属性对象

具体过程:得到解析器工厂——得到解析器——得到Document对象——得到根元素——根据元素的getNodeChilds循环或迭代找出所有节点

SAX

 两个抽象类

SAXParserFactory:解析器工厂

SAXParser:解析器

一个类

DefaultHandler:继承该类,并重写startElement、characters、endElement方法

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException

public void endElement(String uri, String localName, String qName) throws SAXException

public void characters(char[] ch, int start, int length) throws SAXException

 在startElement中解析开始标签,characters解析text节点,endElement中解析结束标签

 

dom4j解析

 SAXReader reader = new SAXReader();

Document document = reader.read("filePath");

通过document对象可以得到根元素,然后解析器子元素

private static void parseXML(String path) {
        SAXReader reader = new SAXReader();
        try {
            
            Document document = reader.read(new File(path));
            Element root = document.getRootElement();
//            parse(root);
            Element student = root.element("student");
            List<Element> list = student.elements();
            
            Element school = DocumentHelper.createElement("school");//生成元素
            school.setText("cdut");
            list.add(1, school);//特定位置添加
            OutputFormat format = OutputFormat.createPrettyPrint();//设置格式
            
            XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);//回写
            writer.write(document);
            
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

XPATH

XPATH写法

/aaa/bbb:表示aaa标签下的bbb元素(一层)

/aaa//bbb:表示aaa标签下的所有bbb元素(多层)

/aaa/*:aaa层下的所有元素

/aaa/bbb[1]:aaa层下第一个名为bbb的元素

//aaa[@id]:属性名有id且名为aaa的元素

/aaa[@id = "1"]:第一层元素名为aaa,属性名有id,且id的值为"1"的元素

XPATH与DOM4J

引入jar包:jaxen.jar

具体实现:

private static void parseXML(String path) {
        SAXReader reader = new SAXReader();
        try {
            
            Document document = reader.read(new File(path));
//            get single node in particular position
//            Node name = document.selectSingleNode("/Students/student/age[1]");
//            System.out.println(name.getText());
//            get node list of all ele which has name "age"
//            List<Node> nodeList = document.selectNodes("//age");
//            for(Node node : nodeList) {
//                System.out.println(node.getText());
//            }
            
            
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

 

posted on 2018-11-18 19:21  -Yoda-  阅读(93)  评论(0编辑  收藏  举报

导航