前言
今天天气大好, 起了个大早开始总结一些常用的基础知识.
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

<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>

对于一个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约束示例代码:

<?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约束示例:

<?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>

bookstore.xsd

<?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代码

<?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>

解析代码:

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代码:

<?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>

解析代码:

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的约束以及解析了.

 

[Java拾遗一] XML的书写规范与解析.的更多相关文章

  1. JAVA书写规范

    java程序书写规范 命名规范    1.一般概念        1.尽量使用完整的英文描述符        2.采用适用于相关领域的术语        3.采用大小写混合使名字可读        4 ...

  2. (转)Java代码书写规范

    0. 安装阿里代码规范的eclipse插件 https://www.cnblogs.com/caer/p/7753522.html 1.基本原则 强制性原则:     1.字符串的拼加操作,必须使用S ...

  3. Java实体书写规范

    ** * 用户角色表 */ public class BaseUserRole implements Serializable { private static final long serialVe ...

  4. 你真的了解JAVA中与Webservice相关的规范和实现吗?

    非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JA ...

  5. Spring基础篇——通过Java注解和XML配置装配bean

    自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案 ...

  6. Java中的XML

    XML是一种可扩展的标记语言,可扩展就是<>内的东西可以自己定义,可以随便写.标记语言就是加了<>符号的 .HTML是超文本标记语言,不可以拓展,因为你写个<p> ...

  7. Java SE之XML<一>XML文档规约

    [文档整理系列] Java SE之XML<一>XML文档规约 1.xml文档引用: 1.外部私有DTD: <!DOCTYPE rootNodeName SYSTEM "ur ...

  8. JAXB java类与xml互转

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  9. Shell脚本书写规范

    在日常的运维工作中,Shell脚本肯定是必不可少的工作内容.为方便问题排查.脚本执行历史问题追踪.方便大家共同维护,从网上搜罗结合以往的经验教训拟定以下Bash脚本书写规范.欢迎各位同学指正或补充. ...

随机推荐

  1. 【转载】Windows自带.NET Framework版本大全

    转载自:http://blogs.msdn.com/b/astebner/archive/2007/03/14/mailbag-what-version-of-the-net-framework-is ...

  2. css3的一些新属性1

    <body> /*文本阴影*/ <h1 style="text-shaow:5px 5px 5px #C0F">我爱你</h1> </bo ...

  3. Hibernate 根据实体名称得到DB表名以及表对应的Sequence name

    DB: oracle 10g; entityName:com.signaldemand.flank.hibernate.model.实体名 1. 根据实体名获取DB表相对应的表名 Class<? ...

  4. STS 代码提示快捷键 和 注解提示的修改

    window->Preferences window->Preferences

  5. table的css样式

    经常会遇到table中各种线条重复的问题,画面会显得很难看,下面是解决问题的方法: <!Doctype html><html> <head> <meta ch ...

  6. Java 基本数据类型长度

    System.out.println(Integer.MAX_VALUE-(-Integer.MAX_VALUE)); //内存溢出System.out.println(Integer.MAX_VAL ...

  7. StringGrid 实例2:1、获取 StringGrid 的行数、列数; 2、给单元赋值.

    实例2: 本例功能: 1.获取 StringGrid 的行数.列数; 2.给单元赋值. 运行效果图:

  8. NSLog函数重写

    跟C++的输出函数相比,NSlog函数有个很大的优势,就是它可以输出对象. 在实际使用过程中,我们可以通过实现description函数来实现对NSLog函数的重写 -(NSString*)descr ...

  9. Json&Razor&控制器

    JsonJson 属于JavaScript所以要书写在<script></script>中1.语法规则: 1.1:键值对 1.2:逗号分隔 1.3:花括号保存对象 1.4:方括 ...

  10. ThinkPHP提交表单判断上传图片经验总结

    在用TP框架开发程序处理接收到的表单的时候,要判断<input type="file" name="img">是否有上传图片,来决定是否要将对应的图 ...