Xml的约束和在Java中的解析

Xml的约束和在Java中的解析

moran
2020-09-15 / 0 评论 / 298 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月14日,已超过71天没有更新,若内容或图片失效,请留言反馈。

XML(了解)

extensible markup language(可标记的扩展语言)

xml第一行必须是文档声明

<?xml version="1.0" encoding="UTF-8"?>

在xml中如果数据不想被解析成xml格式返回,可以用<![CDATA[...]]包含数据。

XML的约束

DTD

DTD语法

通过<!ELEMENT 节点名称 元素内容>格式来定义。
比如有个xml文件,给它约束的条件是根标签为persons,根标签下可以有多个person节点,person只有name和age节点,且顺序是先name后age。数据如下:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <name>张三</name>
        <age>18</age>
    </person>
</persons>

那么,该约束应该定义成这样:

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

#PCDATA是被解析的字符数据.意为该数据为字符数据。

如果要为元素添加属性,那么将用下面的语法来声明。

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

元素名称:属性要定义的元素
属性类型:
默认值:

引入方式

有两种引用方式

  • 内部引入
    将约束写在xml文件内部(写在定义文档类型下面)

列如:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE persons[
    <!ELEMENT persons (person+)>
    <!ELEMENT person (name,age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
]>
<persons>
    <person>
        <name>小明</name>
        <age>10</age>
    </person>
    <person>
        <name>小明</name>
        <age>10</age>
    </person>
</persons>
  • 外部导入
    格式:
<!DOCTYPE 文档根节点 SYSTEM "DTD文件的URL">

例如:

<DOCTYPE persons SYSTEM "persons.dtd">

外部导入除了导入本地的资源外还可以引入网络资源
格式:

<!DOCTYPE 文档根节点 PUBLIC "DTD名称(可省略)" "DTD文件的URL">

例如:

<!DOCTYPE persons PUBLIC "http://localhost/persons.dtd">

Schema

不同于dtd是以dtd为结尾,schema其实也是一个xml文件,但以xsd结尾,这个文件中约束了引入该约束的文件,但schema还需要引入一个网络资源用来约束自己。

Schema语法

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
elementFormDefault="qualified">
</schema>
  • xmlns

xml的名称空间,固定,用来约束该约束文件的。

  • targetNamespace

目标名称空间,下面定义的元素都与这个名称空间绑定

  • elementFormDefault

元素的格式化情况,元素前面不需要名称空间。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.w3school.com.cn"
        elementFormDefault="qualified">
    <element name="students">
        <complexType>
            <sequence  maxOccurs="unbounded">
                <element name="student">
                    <complexType>
                        <sequence>
                            <element name="name" type="string"></element>
                            <element name="age" type="int"></element>
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>

    </element>
</schema>

在上面的schema中,element用来定义元素,name是元素的名称,complexType声明这是一个复杂元素,sequence声明这是一个有序的元素,maxOccurs表示该元素能声明的次数,unbounded表示无限次。因此上

引入schema

下面的xml被上方的schema约束。

<?xml version="1.0" encoding="UTF-8" ?>
<students
        xmlns="http://per.pblog.top/students"
>
    <student>
        <name>张三</name>
        <age>12</age>
    </student>
</students>

名称空间可以用来多次引入schema,在格式xmlns:aa="",元素前面加上aa:,如<aa:stduent></aa:student>

XPATH

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

Xpath语法

w3school:

在java中如何解析xml

有多种解析方法,常用的如下两种。

DOM

将整个xml读入文档中,整个文档为document,属性为attribute,所有元素为element,文本为text,全部统称为Node节点。如果xml特别大,会造成内存溢出。可以对文档进行增删操作。

SAX

Simple API For Xml ,基于事件驱动,读取一行,解析一行。只能查询。

基于DOM和SAX的库

  • dom4j

    • 引入dom4j的jar包

下载:dom4j-2.1.1.jar

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

public class xmlParse {

    public static void main(String[] args){
        try {
            // 1.创建sax读取对象
            SAXReader saxReader = new SAXReader();
            // 2.读取xml文件为document对象
            Document document = saxReader.read(new File("src/students.xml"));
            // 3.获取根元素
            Element element = document.getRootElement();
            // 4.通过根元素获取其下的所有子元素
            List<Element> elements = element.elements();
            // 5.遍历子元素
            for(Element ele : elements){
                // 通过节点获取下面的元素的文本内容
                String name = ele.element("name").getText();
                String age = ele.element("age").getText();
                System.out.println(name+"==="+age);
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}
> dom方法只需要将SAXReader改成DOMReader即可。
  • jdom

    >和dom4j的方法差不多。
    

还有其他不常用的库不列出。

如果要在解析中要用到xpath,那么还需要引入xpath的包

下载:jaxen-1.1-beta-6.jarjaxen-1.1-beta-6.jar

代码唯一不同的是用selectNodes或selectSingleNode来选择,参数是xpath语法。列如rootElement.selectSingleNode('//AA')选择一个AA标签。selectNodes()方法是选择所有xpah选择中的标签。

0

评论 (0)

取消