1 XML概述

  • XML是指可扩展的标记语言,很类似与HTML。它被设计的宗旨就是描述数据,而非显示数据。
  • XML标签没有被预定义,需要用户自定定义标签。
  • XML技术是W3C组织发布的。目前遵循的规范是1.0规范。
  • XML被广泛认为是继java之后在Internet上最激动人心的新技术。

2 XML技术能够解决什么问题?

  • XML语言出现的根本目的就是在于描述数据。
  • XML是一种通用的数据交换格式。
  • 在XML语言中,允许yoghurt自定义标签。一个标签用于描述一段数据,一个标签有开始标签和结束表现,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,所以XML可以实现数据关系的描述。
  • XML中的数据必须通过软件程序来解析和显示,这样的解析程序称为Parser解析器。

3 XML的常见应用

  • 在java开发中,传统的配置文件是*.properties文件,而XML表示的数据更为丰富。
  • XML技术除了用于描述有关系的数据外,还经常用于软件的配置文件,以描述程序模块之间的关系。
  • 在一个软件系统中,通过XML配置文件可提供系统的灵活度,即程序的行为是通过XML文件来配置的,而不是硬编码。

4 XML的文档声明

  • 在编写XML的时候,需要先使用文档声明来声明XML文档,且必须在第一行。
  • 最简单的语法:<?xml version="1.0"?>
  • 用encoding属性说明文件所使用的字符编码。

5 元素

  • XML元素是指XML文件中出现的标签。一个标签分为起始和结束标签。
  • 一个标签有若干个子标签,但所有标签必须合理的嵌套,不允许交叉嵌套。
  • 一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或后代标签。
  • XML中不会忽略主题内容中出现的空格和换行。
  • 元素的名称可以包含字母、数字、减号、下划线和英文句点,但必须遵守下面的一些规范:
    • 严格区分大小写
    • 只能以字母或下划线开头
    • 不能以XML或xml开头
    • 名车字符之间不能有空格或制表符
    • 名称字符之间不能使用冒号  

6 属性

  • 一个元素可以有多个属性,每个属性都有它自己的名称和取值。
  • 属性值一定要用引号引起来。
  • 属性名称的命名规范和元素的命名规范相同。
  • 元素中的属性是不允许重复的。
  • 在XML技术中,标签属性所代表的信息也可以被改为子元素的形式描述。

7 注释

  • XML中的注释语法为:<!-- 这是注释 -->
  • 注意:
    • XML声明之前不能有注释。
    • 注释不能嵌套。  

8 特殊字符

特殊字符 替代符号
& &amp;
< &lt;
> &gt;
" &quot;
' &apos;

9 XML约束

9.1 为什么需要约束

  • XML都是用户自定义的标签,如果出现小小的错误,软件程序将不能正确的获取文件中的内容而报错。
  • XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档被称之为约束。
  • 格式良好的XML:遵循XML语法的XML。
  • 有效的XML:遵循约束文档的XML。
  • 总之:
    • 约束文档定义了在XML中允许出现的元素名称、属性和元素出现的顺序等等。  

9.2 常用的约束技术

  • DTD
  • Schema

9.3 DTD

  • DTD:Document Type  Definition:文档类型定义。
  • 作用:约束XML的书写规范。
  • DTD文件的扩展名是.dtd

9.4 编写DTD的方式

9.4.1 直接打dtd的内容放在XML文件中

  • 示例:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE 书架 [
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
]>
<书架>
    <书>
        <书名>java从入门到放弃</书名>
        <作者>你好</作者>
        <售价>0.01</售价>
    </书>
    <书>
        <书名>c从入门到精通</书名>
        <作者>我好</作者>
        <售价>1.00</售价>
    </书>
</书架>

9.4.2 dtd作为单独的文件存在

  • book.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
  • book.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE 书架 SYSTEM "book.dtd" >
<书架>
    <书>
        <书名>java从入门到放弃</书名>
        <作者>你好</作者>
        <售价>0.01</售价>
    </书>
    <书>
        <书名>c从入门到精通</书名>
        <作者>我好</作者>
        <售价>1.00</售价>
    </书>
</书架>

10 XML 的解析方式

  • DOM
  • SAX

11 java解析XML概述

  • JAXP:开发包是JavaSE的一部分,它是由以下三个部分组成的:

    • org.w3c.dom:提供DOM方式解析XML的标准接口
    • org.xml.sax:提供SAX方式解析XML的标准接口
    • javax.xml:提供了解析XML文档的类  
  • XML的解析开发包

    • JAXP:是sun公司推出的解析标准实现。
    • Dom4j:是开源组织推出的解析开发工具包。  

12 使用JAXP进行DOM解析

  • javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance()方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
  • 获取JAXP中的DOM解析器

    • ①调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。
    • ②调用工厂对象的newDocumentBuilder()方法得到DOM解析器对象。
    • ③调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象,这样就可以利用DOM特性对这个XML文档进行操作了。  
  • 示例:读取所有节点的名称
<?xml version='1.0' encoding='UTF-8'?>
<书架>
    <书>
        <书名>java从入门到放弃</书名>
        <作者>你好</作者>
        <售价>0.01</售价>
    </书>
    <书>
        <书名>c从入门到精通</书名>
        <作者>我好</作者>
        <售价>1.00</售价>
    </书>
</书架>
package com;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

/**
 * 2017/10/28
 * 说明:
 */
public class JAXPDemo {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        /*
        * 通过DocumentBuilderFactory获取解析器工厂
        */
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        /**
         * 通过解析器工厂获取解析器
         */
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        /**
         * 解析器解析xml获取document对象
         */
        Document document =  builder.parse(new File("D:\\code\\web\\src\\main\\webapp\\book.xml"));

        Node book =  document.getElementsByTagName("书架").item(0);

        if(book.getNodeType() == Node.ELEMENT_NODE){
            Element e = (Element) book;

            getNode(e);

        }

    }

    private static void getNode(Node d) {
        if(d.getNodeType() == Node.ELEMENT_NODE){
            System.out.print(d.getNodeName()+"\n");
        }
        NodeList childNodes = d.getChildNodes();
        for(int x = 0;x<childNodes.getLength();x++){
            Node node = childNodes.item(x);
            getNode(node);
        }

    }
}
  • 示例:将书名是java从入门到放弃的作者改为呵呵
<?xml version='1.0' encoding='UTF-8'?>
<书架>
<书>
    <书名>java从入门到放弃</书名>
    <作者>你好</作者>
    <售价>0.01</售价>
</书>
<书>
    <书名>c从入门到精通</书名>
    <作者>我好</作者>
    <售价>1.00</售价>
</书>
</书架>
package com;

import javafx.scene.transform.Transform;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 2017/10/28
 * 说明:
 */
public class JAXPDemo {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, TransformerException {
        /*
        * 通过DocumentBuilderFactory获取解析器工厂
        */
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        /**
         * 通过解析器工厂获取解析器
         */
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        /**
         * 解析器解析xml获取document对象
         */
        Document document =  builder.parse(new File("D:\\code\\web\\src\\main\\webapp\\book.xml"));

        Node authorNode  = document.getElementsByTagName("作者").item(0);

        if(authorNode.getNodeType() == Node.ELEMENT_NODE){
            Element authorElement = (Element) authorNode;

            authorElement.setTextContent("呵呵");
        }

        TransformerFactory transformerFactory = TransformerFactory.newInstance();

        Transformer transformer = transformerFactory.newTransformer();

        transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("D:\\code\\web\\src\\main\\webapp\\book.xml")));

    }

}

XML (一)的更多相关文章

  1. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  2. .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

  4. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  5. UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)

    最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...

  6. PHP中遍历XML之SimpleXML

    简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.XML是当今用于传输数据的两大工具之一,另外一个是json. 我们在PHP中使用XML也是用来传输数据, ...

  7. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

  8. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  9. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  10. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

    Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...

随机推荐

  1. Golang 网络爬虫框架gocolly/colly 五 获取动态数据

    Golang 网络爬虫框架gocolly/colly 五 获取动态数据 gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goque ...

  2. noi 2016 游记

    先挖个坑..这回大概不会太监吧(大雾 day -2 下午起飞的飞机,晚上到了成都..把东西扔到旅馆后就组队外出觅食了... 街上人不多,逛了半天才发现一家卖本地小吃的小店. KPM:诶诶给我来碗酸辣粉 ...

  3. tju_4147 kd树+最小生成树

    kd树模板+全图最小生成树 标签(空格分隔): kd树+最小生成树 题目链接 题意: k维太空中有n个点,每个点可以与距离它m近的点连边,现在给你一堆点,并给出坐标,现在要建立通信网络,一些可以互相到 ...

  4. C. The Smallest String Concatenation

    C. The Smallest String Concatenation time limit per test 3 seconds memory limit per test 256 megabyt ...

  5. android组件化方案、二维码扫码、Kotlin新闻客户端、动画特效等源码

    Android精选源码 CalendarView日历选择器 android下拉刷新动画效果代码 一个非常方便的fragment页面框架 android组件化方案源码 Zxing实现二维码条形码的扫描和 ...

  6. 使用 SVG 和 JS 创建一个由星形变心形的动画

    序言:首先,这是一篇学习 SVG 及 JS 动画不可多得的优秀文章.我非常喜欢 Ana Tudor 写的教程.在她的教程中有大量使用 SVG 制作的图解以及实时交互 DEMO,可以说教程的所有细枝末节 ...

  7. jquery dataTimePicker日历插件(精确到小时)

    效果图:      下载地址:https://github.com/WangChangyao/jquery-dataTimePicker.git <!DOCTYPE html> <h ...

  8. C#历年来最受欢迎功能

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://www.dotnetcurry.com/csharp/1 ...

  9. [学习OpenCV攻略][009][从摄像机读入数据]

    cvCreateCameraCapture(设备ID) 创建一个摄像机视频,返回值是CvCapture*类型.设备ID表示设备的编号,如果有多个摄像机设备,-1表示随机选择一个设备. #include ...

  10. 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug

    最近在学习淘淘商城中用到的技术,感觉受益良多,遇到一个比较奇怪的bug调了好久,遂心乐之分享于诸君 bug情况是这样的:在商城的后台上传图片之后图片回显不出来,右键查看链接,发现链接被加了localh ...