前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Java拾遗一] XML的书写规范与解析.

[Java拾遗一] XML的书写规范与解析.

作者头像
一枝花算不算浪漫
发布2018-05-18 11:05:46
1.6K0
发布2018-05-18 11:05:46
举报
文章被收录于专栏:一枝花算不算浪漫的专栏

前言 今天天气大好, 起了个大早开始总结一些常用的基础知识. XML一直来说都很陌生, 使用大多是用于配置文件, 之前并没有细究过其中的约束规范, 今天刚好没事来学习并总结下. 


1,XML基础介绍   XML 指可扩展标记语言(EXtensible Markup Language),也是一种标记语言,很类似 HTML.它的设计宗旨是传输数据,而非显示数据它;标签没有被预定义,需要自行定义标签。   xml的作用:     XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。简单的说,我们在开发中使用XML主要有以下两方面应用.            a.XML做为数据交换的载体,用于数据的存储与传输     b.XML做为配置文件 2,书写规范

注意事项:     xml必须有根元素(只有一个)

xml标签必须有关闭标签

xml标签对大小写敏感

xml的属性值须加引号

特殊字符必须转义

xml中的标签名不能有空格

空格/回车/制表符在xml中都是文本节点

xml必须正确地嵌套

    我们将符合上述书写规则的XML叫做格式良好的XML文档。 在讲述XML组成部分前,我们必须对XML的树型结构有所了解.下面是一个简单的XML

代码语言:javascript
复制
<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>
图片1
图片1

对于一个xml文件,首先必须要有根元素,该元素是所有其它元素的父元素。而在xml中所有元素形成了一棵树。父,子及同胞等术语描述了元素之间的关系。所有的元素都可以拥有子元素。相同层级上的子元素成为同胞。 所有元素都可以拥有文本内容和属性。     Root  根元素     Element 元素     Attribute 属性     Text  文本 在开发中,我们将上述内容也统称为Node(节点)。 3,xml的作用详解      1.不同语言之间交换数据-- 用数据库代替     2.配置文件-- ☆ xml的约束: 作用:明确的告诉我们那些元素和属性可以写,以及他们的顺序如何. 分类:DTD约束和SCHEMA约束         要求:给你xml约束你可以写出对应的xml文档即可. 1, DTD约束:struts hibernate中有使用 与xml文档的关联: 方式1:内部关联                     格式:<!DOCTYPE 根元素名称 [dtd的语法]>

方式2:外部关联--系统关联                     格式:<!DOCTYPE 根元素名称 SYSTEM  "dtd路径">                     dtd的后缀名是 .dtd 方式3:外部关联--公共关联                     格式:<!DOCTYPE 根元素名称 PUBLIC "dtd的名称" "dtd路径"> 元素:                 格式1:<!ELEMENT 元素的名称 (内容)>                 格式2:<!ELEMENT 元素的名称 类别> 属性:                 格式:<!ATTLIST 元素的名称 属性的名称 类型 默认值>                 属性的类型:                     ID:唯一                     CDATA:文本                 默认值:                     REQUIRED:必须出现                     IMPLIED:可以选择 类别:                 #PCDATA:文本是一个字符串,不能出现子元素 ,用的时候用(#PCDATA) 符号:                 +     >=1                 ?     0|1                 *     任意值                 |     选择                 ()    分组                 ,     顺序 DTD约束示例代码:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore[
    <!ELEMENT bookstore (book+)>
    <!ELEMENT book (title,author,year,price)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT year (#PCDATA)>    
    <!ELEMENT price (#PCDATA)>    
    <!ATTLIST book category CDATA #REQUIRED>
    <!ATTLIST title lang CDATA #IMPLIED>
]>
<bookstore>
    <book category="COOKING" >
        <title lang="en" >Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>

2,SCHEMA约束:spring中使用的就是schema约束 作用:用来替代dtd的,多个schema可以出现一个xml文档上             需求:                    xml 文档中出现了<table>                 a约束上的---table :桌子 属性  height width                 b约束上的---table :表格 属性  rows  cols             名称空间:                 作用:用来确定标签的约束来自于那个约束文档上                 格式:                     方式1:xmlns="名称"                     方式2:xmlns:别名="名称"                 例如:                     table  代表的是桌子                     b:table 代表的就是表格              schema的语法:                 后缀名.xsd                 关联 1.约束文件的关联 bookstore.xsd                         xmlns="http://www.w3.org/2001/XMLSchema"-- 固定值,自定义的约束文件可以出现那些标签                         targetNamespace="http://www.example.org/bookstore"                         给当前的xsd起个名称空间,方便目标xml文件引用,名字可以随便起,一般使用域名/自定义名称既可以                         例如: targetNamespace="bookstore"                             targetNamespace="http://www.augmentum.com/bookstore"                         确定一个目标xml根元素                             <element name="bookstore"></element> 2.xml文件的关联                         写根标签                         添加schema约束                             1.xmlns="约束的名称空间" -- 值为xsd文件上的targetNamespace的内容                         例如:                                xmlns=="http://www.augmentum.com/bookstore"                             2.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" :固定的写法 声明此文档是一个             被schema约束的文件                             3.确定文档的位置                                 xsi:schemaLocation="{和xsd文件中的targetNamespace} {xsd文件的路径}"                     关联小结:                         先有约束文件. .xsd                             targetNamespace 就是给当前的约束文件起个名字,方便xml使用                             必须确定根元素                         后有xml文件.                             写根元素                             添加约束                                 xmlns="名字"  他的值为targetNamespace中起的名称                                 xsi:schemaLocation="名字 位置"                     语法: 1.确定根元素                             <element name >                             name:元素的名称                             type:元素的数据类型 2.确定元素类型                             复杂的元素                                 <complexType>                             简单的元素 -- 几乎看不见                                 <simpleType> 3.确定顺序:                             <sequence maxOccurs="3">  按次序 相当于  dtd 中,                             <all> 随意                             <choice> 或 相当于dtd中的 |                             maxOccurs 最大的出现次数    值为unbounded指的是无上限                             minOccurs 最小的出现次数 4.确定属性                             <attribute name="category" type="string" use="required" />                             name :属性的名称                             type:属性的数据类型                             use 相当于dtd中 默认值                                 值为required:必须出现                                 值为optional:可选 5.若有属性的元素,内容只是文本                             <complexType>  --- 指定元素为复杂类型                                 <simpleContent>--- 指定元素是一个简单的内容,只有文本                                     <extension base="string">    -- 文本内容进行扩展                                         <attribute name="lang" type="string" /> -- 添加属性                                     </extension>                                 </simpleContent>                             </complexType> Schema约束示例:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="aaa"
    xmlns:tns="http://www.example.org/bookstore" 
    elementFormDefault="qualified">
    <element name="bookstore" >
        <!--
            1.确定根元素
                <element name >
                name:元素的名称
                type:元素的数据类型
            2.确定元素类型 
                复杂的元素
                    <complexType>
                简单的元素 -- 几乎看不见
                    <simpleType>
            3.确定顺序:
                <sequence maxOccurs="3">  按次序 相当于  dtd 中,
                <all> 随意
                <choice> 或 相当于dtd中的 |
                
                maxOccurs 最大的出现次数    值为unbounded指的是无上限
                minOccurs 最小的出现次数
            4.确定属性
                <attribute name="category" type="string" use="required" />
                name :属性的名称
                type:属性的数据类型
                use 相当于dtd中 默认值
                    值为required:必须出现
                    值为optional:可选
         -->
        
        <complexType>
            <sequence maxOccurs="unbounded" minOccurs="1">
                <element name="book">
                    <complexType>
                        <sequence>
                            <element name="title">
                                
                            </element>
                            <element name="author" type="string" />
                            <element name="year" type="date" />
                            <element name="price" type="double" />
                        </sequence>
                        <attribute name="category" type="string" use="optional" />
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<bookstore xmlns="aaa"
xsi:schemaLocation="aaa bookstore.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</bookstore>

4, xml解析

  获取xml中的内容     解析方式:SAX和DOM     区别:     sax:逐行的解析,不能增删改     dom:把整个文档加载到内存中,翻译成一棵树,就可以进行crud操作   要求:     会查询(获取)     DOM4J的解析(只需会查询操作) 1.导入包   2.获取document   3.获取根元素   4.获取其他节点 常用的方法: ☆     SAXReader reader=new SAXReader();     Document doc=reader.read(文件路径);     获取根元素:       Element root=doc.getRootElement();     获取其他节点:     获取属性       List<Element> bookList=root.elements();     获取book的属性       String value=bookElement.attributeValue("category");       bookElement.elementText("title");--获取title的文本内容     扩展方法:       获取book         Iterator<Element> it = root.elementIterator();       获取属性:         bookElement.attribute("category").getValue();       获取文本         bookElement.element("title").getText(); 示例解析1: xml代码

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>

解析代码:

代码语言:javascript
复制
public static void main(String[] args) throws DocumentException {
    //获取Document
    Document document = new SAXReader().read("D:/Users/WangMeng/workspace/day08_XML/dtd/bookstore.xml");
    //获取根元素
    Element root = document.getRootElement();
    //获取其他节点
    /*获取其他节点方法一
    List<Element> bookList = root.elements();
    for (Element bookElement : bookList) {
        //获取属性
        //String value = bookElement.attributeValue("category");
        //System.out.println(value);
        
        //获取子标签的文本内容
        String textValue = bookElement.elementText("title");
        System.out.println(textValue);
    }
    */
    
    //获取其他节点方法二
    Iterator<Element> it = root.elementIterator();
    while (it.hasNext()) {
        Element bookElement = it.next();
        //获取属性
        //String value = bookElement.attribute("category").getValue();
        //获取元素, 元素内容
        String value = bookElement.element("title").getText();
        System.out.println(value);
    }
}

X-path解析(获取) selectNodes(string):获取集合 //book selectSingleNode(string):获取的单一的元素,若匹配的是一个集合的话,只取第一个 使用之前导入 jaxen-1.1-beta-6.jar 关于Xpath更详细的可以去w3c文档看xml中关于xpath的api.

示例解析2: xml代码:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>

解析代码:

代码语言:javascript
复制
public static void main(String[] args) throws DocumentException
{
    //获取Document
    Document document = new SAXReader().read("D:/Users/WangMeng/workspace/day08_XML/dtd/bookstore.xml");
    
    //获取category="WEB"的book元素
    /*
     * 路径匹配: /a/b/c
     * 元素匹配 : //c
     * 属性匹配: //c[@属性='属性值']
     * 含有子元素: //c[d]
     * 
     * 
     */
    //Element bookElement = (Element)document.selectSingleNode("//book[@category='WEB']");
    Element bookElement = (Element)document.selectSingleNode("//book[price > 35]");
    System.out.println(bookElement.attributeValue("category"));
}

关于xml的内容就到这里了, 相信看完这些内容 以后再也不担心xml的约束以及解析了. 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-04-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档