1. 什么是XML?

XML 指可扩大标记语言(EXtensible Markup Language)
XML 是一种标记语言,很相似 HTML
XML 的设计主旨是传输数据,而非显示数据
XML 标签没有被预约义。您须要自行定义标签。
XML 被设计为具备自我描述性。
XML 是 W3C 的举荐规范

2. 为什么应用XML?

咱们没有XML这种语言之前,咱们应用的是String作为两个程序之间的通信!当初问题就来了,如果咱们传输的是带有关系型构造的数据,String怎么表白呢?String对关系型数据不善于,要是形容起来也难免会有歧义的时候!

HTML语言自身就有缺点:

标记都是固定的,不能自定义。HTML语言中有什么标记就只能用什么标记
HTML标签自身就短少含意 (tr标签外面什么内容都能放进去,不标准!)
HTML没有实现真正的国际化

3. XML的用处

①:配置文件(例子:Tomcat的web.xml,server.xml……),XML可能十分清晰形容出程序之间的关系
②:程序间数据的传输,XML的格局是通用的,可能缩小替换数据时的复杂性!
③:充当小型数据库,如果咱们的数据有时候须要人工配置的,那么XML充当小型的数据库是个不错的抉择,程序间接读取XML文件显然要比读取数据库要快呢!

4. xml的技术架构

XML被设计为“什么都不做”,XML数据或XML文档只用于组织、存储数据,除此之外的数据生成、读取、传送、存取等等操作都与XML自身无关!

于是乎,想要操作XML,就须要用到XML之外的技术了:

为XML定规定:当初个别应用DTD或Schema技术,当然了Schema技术更为先进!
解析XML的数据:个别应用DOM或者SAX技术,各有各的长处
提供款式:XML个别用来存储数据的,但设计者野心很大,也想用来显示数据(但没人用XML来显示数据),就有了XSLT(eXtensiable Stylesheet Language Transformation)可扩大款式转换语言

5. XML语法

5.1 文档申明

XML申明放在XML的第一行
version —— 版本
encoding —— 编码
standalone–独立应用 —— 默认是no。standalone示意该xml是不是独立的。
如果是yes,则示意这个XML文档时独立的,不能引用内部的DTD标准文件;
如果是no,则该XML文档不是独立的,示意能够援用内部的DTD标准文档。
正确的文档申明格局,属性的地位不能扭转!
<!-- 正确的文档申明格局,属性的地位不能扭转! --><?xml version="1.0" encoding="utf-8" standalone="no"?>

5.2 元素

元素中须要值得注意的中央:

XML元素中的呈现的空格和换行都会被当做元素内容进行解决
每个XML文档必须有且只有一个根元素
元素必须闭合
大小写敏感
不能穿插嵌套
不能以数字结尾

XML的语法是标准的!不要随便乱写!

5.3 属性

属性是作为XML元素中的一部分的,命名标准也是和XML元素一样的!

<!-- 属性名是name,属性值是chinese --><china name="chinese">    </china>

5.4 CDATA

在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容解决。

遇到此种状况,能够把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会解决,而是间接一成不变的输入。

 <![CDATA[     内容     ]]>

5.5 转义字符

对于一些单个字符,若想显示其原始款式,也能够应用本义的模式予以解决。

6. XML解析

6.1 XML解析形式有两种:

①:dom (Document Object Model) :文档对象模型,是W3C组织举荐解析XML的一种形式。

②:sax (Simple API For XML):它是XML社区的规范,简直所有XML解析器都反对它!

6.2 XML解析操作

应用程序不是间接对XML文档进行操作的,而是由XML解析器对XML文档进行剖析,而后应用程序通过XML解析器所提供的DOM接口或者SAX接口对剖析后果进行操作,从而间接地实现了对XML文档的拜访!

7. Java解析XML

xml文档中的数据

<?xml version="1.0" encoding="utf-8" standalone="no"?><china>    <guangzhou >广州</guangzhou>    <shenzhen>深圳</shenzhen>    <beijing>北京</beijing>    <shanghai>上海</shanghai></china>

7.1 DOM解析

7.1.1 遍历

public class Main{    public static void main(String[] args) throws ParserConfigurationException , IOException, SAXException {        //API标准:须要用一个工厂来造解析器对象,先造了一个工厂        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();        //获取解析器对象        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();        //解析XML文档,失去了代表XML文档的Document对象!        Document document = documentBuilder.parse(new File("test.xml"));        list(document);    }    private static void list(Node node){        if(node.getNodeType() == Node.ELEMENT_NODE){            System.out.println(node.getNodeName());        }        NodeList nodelist = node.getChildNodes();        for(int i = 0;i<nodelist.getLength();i++){            Node child = nodelist.item(i);            list(child);        }    }}/*Output:chinaguangzhoushenzhenbeijingshanghai */

7.1.2 查问

private static void read(Document document){    NodeList nodelist = document.getElementsByTagName("a");    Node node = nodelist.item(0);    String value = node.getTextContent();    System.out.println(value);}/*Output:广州 */

7.1.3 减少

减少到XML文档中的最初

private static void add(Document document) throws TransformerException {    //创立须要减少的节点    Element element = document.createElement("hangzhou");    //向节点增加文本内容    element.setTextContent("杭州");    //失去须要增加节点的父节点    Node parent = document.getElementsByTagName("china").item(0);    //把须要减少的节点挂在父节点上面去    parent.appendChild(element);    //获取一个转换器它须要工厂来造,那么我就造一个工厂    TransformerFactory transformerFactory = TransformerFactory.newInstance();    //获取转换器对象    Transformer transformer = transformerFactory.newTransformer();    //把内存中的Dom树更新到硬盘中    transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}

减少到指定节点的前一个

private static void add2(Document document) throws TransformerException {    //获取到beijing节点    Node beijing = document.getElementsByTagName("beijing").item(0);    //创立新的节点    Element element = document.createElement("guangxi");    //设置节点的文本内容    element.setTextContent("广西");    //获取到要创立节点的父节点,    Node parent = document.getElementsByTagName("china").item(0);    //将guangxi节点插入到beijing节点之前!    parent.insertBefore(element, beijing);    //将内存中的Dom树更新到硬盘文件中    TransformerFactory transformerFactory = TransformerFactory.newInstance();    Transformer transformer = transformerFactory.newTransformer();    transformer.transform(new DOMSource(document), new StreamResult("city.xml"));}

7.1.4 删除

private static void delete(Document document) throws TransformerException {    //获取到beijing这个节点    Node node = document.getElementsByTagName("beijing").item(0);    //获取到父节点,而后通过父节点把本人删除了    node.getParentNode().removeChild(node);    //把内存中的Dom树更新到硬盘文件中    TransformerFactory transformerFactory = TransformerFactory.newInstance();    Transformer transformer = transformerFactory.newTransformer();    transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}

7.1.5 批改

private static void updata(Document document) throws TransformerException {    //获取到广州的结点    Node node = document.getElementsByTagName("guangzhou").item(0);    node.setTextContent("广州你好");    //将内存中的Dom树更新到硬盘文件中    TransformerFactory transformerFactory = TransformerFactory.newInstance();    Transformer transformer = transformerFactory.newTransformer();    transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}

7.1.6 操作属性

private static void updataAttribute(Document document) throws TransformerException {     //获取到guangzhou节点    Node node = document.getElementsByTagName("guangzhou").item(0);    //当初node节点没有减少属性的办法,所以我就要找它的子类---Element    Element guangzhou = (Element) node;    guangzhou.setAttribute("play","gzchanglong");    //如果要删除属性就用removeAttribute()办法    //将内存中的Dom树更新到硬盘文件中    TransformerFactory transformerFactory = TransformerFactory.newInstance();    Transformer transformer = transformerFactory.newTransformer();    transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}

7.2 dom4j解析

须要导入开发包

7.2.1 为什么要有dom4j?

dom毛病:比拟消耗内存
sax毛病:只能对xml文件进行读取,不能批改,增加,删除
dom4j:既能够提高效率,同时也能够进行crud操作

7.2.2 获取Document对象

①:读取XML文件,取得document对象(这种最罕用)

SAXReader reader = new SAXReader();Document document = reader.read(new File("input.xml"));

②:解析XML模式的文本,失去document对象

String text = "<members></members>";Document document=DocumentHelper.parseText(text);

③:被动创立document对象.

Document document =DocumentHelper.createDocument();//创立根节点Element root = document.addElement("members");

7.2.3 查问

XML文件

<?xml version="1.0" encoding="UTF-8" ?>     <person>    <name littleName="zk">xzk</name>    <age>20</age></person>

个别查问

public void read() throws DocumentException {    //获取到解析器    SAXReader saxReader = new SAXReader();    //获取到XML文件的流对象    InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");    //通过解析器读取XML文件    Document document = saxReader.read(inputStream);    //获取失去根节点    Element root = document.getRootElement();    //获取失去name节点    Element name = root.element("name");    //失去了name节点,就能够获取name节点的属性或者文本内容了!    String text = name.getText();    String attribute = name.attributeValue("littleName");    System.out.println("文本内容是:" + text);    System.out.println("属性内容是:" + attribute);}/*Output:文本内容是:xzk属性内容是:zk */

多层构造的查问

//获取失去根节点Element root = document.getRootElement();//一层一层地获取到节点Element element = root.element("guangdong").element("guangzhou").element("luogang");String value = element.getText();System.out.println(value);

7.2.4 减少

public void add() throws Exception {    //获取到解析器    SAXReader saxReader = new SAXReader();    //获取到XML文件的流对象    InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");    //通过解析器读取XML文件    Document document = saxReader.read(inputStream);    //创立出新的节点,为节点设置文本内容    Element newElement = DocumentHelper.createElement("name");    newElement.setText("ouzicheng");    //获取到根元素    Element root = document.getRootElement();    //把新创建的name节点挂在根节点上面    root.add(newElement);    //创立带有格局的对象    OutputFormat outputFormat = OutputFormat.createPrettyPrint();    //设置编码,默认的编码是gb2312,读写的编码不统一,会导致乱码的!    outputFormat.setEncoding("UTF-8");    //创立XMLWriter对象    XMLWriter xmlWriter = new XMLWriter(new FileWriter("2.xml"), outputFormat);    //XMLWriter对象写入的是document    xmlWriter.write(document);    //敞开流    xmlWriter.close();}

在指定的地位减少节点

//创立一个新节点Element element = DocumentHelper.createElement("name");element.setText("ouzciheng");//获取失去person下所有的节点元素!List list = document.getRootElement().elements();//将节点增加到指定的地位上list.add(1, element);

7.2.5 批改

//获取失去age元素Element age = document.getRootElement().element("age");age.setText("9999");
XMLWriter和获取Document对象的代码和后面的都是一样的

7.2.6 删除

//获取失去age节点Element age = document.getRootElement().element("age");//失去age节点的父节点,应用父节点的remove删除age节点!age.getParent().remove(age);
XMLWriter和获取Document对象的代码和后面的都是一样的

最初

感激你看到这里,看完有什么的不懂的能够在评论区问我,感觉文章对你有帮忙的话记得给我点个赞,每天都会分享java相干技术文章或行业资讯,欢送大家关注和转发文章!