一、XML语言

XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言)。XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可以存储数据。

1、XML语言书写的注意事项

1.XML标签命名自定义【推荐英文】,标签名中不能包含空格

2.XML空格和换行都表示数据,严格区分大小写

3.XML中特殊字符表示的数据需要使用特殊字符编码和HTML一样

4.CDATA区中的数据不会被识别为语法

<![CDATA[王天霸<><><><><><><><><><><><><><><><>]]>

5.xml中存在两个编码,一个是内容编码,另一个是文件编码,文件编码必须要和内容编码一致

二、解析XMl文件方法及示例

1、使用源生API解析XMl文档(这种方法也叫做JAXP

代码示例:

public class XmlTest {

@Test

public void test() throws ParserConfigurationException, SAXException, IOException {

//根据指定xml文件创建一个文件对象

File file = new File("D:/JAVEEworkspace/xml_study/src/xml_study/contacts.xml");

/*

* 创建文档创建者工厂对象 , DocumentBuilderFactory是一个抽象类,因此使用里面的

* static DocumentBuilderFactory newInstance()  获取 DocumentBuilderFactory 的新实例。

*/

DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();

/*

* 获取文档建造者对象,DocumentBuilder也是一个抽象类,因此使用DocumentBuilderFactor抽象类中的

* abstract  DocumentBuilder newDocumentBuilder() 使用当前配置的参数创建一个新的 DocumentBuilder 实例。

*/

DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();

/*

* 获取Document对象,因为Document是一个接口,因此使用DocumentBuilder抽象类中的

* Document parse(File f) 将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。

*/

Document document = newDocumentBuilder.parse(file);

System.out.println("====================================");

//把xml中王天霸的内容读取出来(最原生的,一步步拿取)

/*

* NodeList getElementsByTagName(String tagname) 返回指定标签的元素。

* NodeList是一个接口,是对有序节点集合的抽象,里面的方法有:

*  int getLength() 列表中的节点数。

*  Node item(int index)   返回集合中的第 index 个项。

* Document接口、Element接口的父接口是Node接口,Node接口的String getTextContent() 此属性返回此节点及其后代的文本内容。

*/

String textContent = document.getElementsByTagName("name").item(0).getTextContent();

System.out.println(textContent);

//获取属性

String textContent2 = document.getElementsByTagName("linkman").item(0).getAttributes().item(0).getTextContent();

System.out.println(textContent2);

System.out.println("=======================================");

}

/*

* 修改数据

*/

@Test

public void testUpdate() throws TransformerException, SAXException, IOException, ParserConfigurationException{

DocumentBuilderFactory newInstance2 = DocumentBuilderFactory.newInstance();

DocumentBuilder newDocumentBuilder2 = newInstance2.newDocumentBuilder();

File file1 = new File("D:/JAVEEworkspace/xml_study/src/xml_study/contacts.xml");

Document document1 = newDocumentBuilder2.parse(file1);

NodeList elementsByTagName = document1.getElementsByTagName("name");

/*

*  void setTextContent(String textContent) 设置节点的文本内容

*/

elementsByTagName.item(0).setTextContent("赵日天");

/*

* 现在修改了数据只是修改了内存中的,我们需要将内存中的数据同步到磁盘,因此,我们必须使用Transformer(类,这个类的构造方法受保护),

* 因此只能使用 TransformerFactory.newTransformer 来获取Transformer实例

*/

/*

* 使用TransformerFactory.newInstance来获取一个TransformerFactory实例,

* 然后调用newTransformer方法来得到Transformer对象

*/

TransformerFactory newInstance = TransformerFactory.newInstance();

Transformer transformer = newInstance.newTransformer();

/*

* abstract  void transform(Source xmlSource, Result outputTarget)

* 将xml资源对象 转换到磁盘文件。

* Source xmlSource  因为Source是一个接口,所以使用其子类DOMSource创建一个实例(多态),即:

* DOMSource(Node n) 创建带有 DOM(文档对象模型) 节点的新输入源实例,而Result也是一个接口,

* 因此也使用其子类StreamResult来创建一个输出文档实例,即:StreamResult(File f)

*/

transformer.transform(new DOMSource(document1), new StreamResult(file1));

}

/*

* 增加xml数据

*/

@Test

public void testAdd() throws SAXException, IOException, ParserConfigurationException, TransformerFactoryConfigurationError, TransformerException {

//创建文档建造者工厂对象

DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();

//创建一个文档建造者对象

DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();

File file = new File("D:/JAVEEworkspace/xml_study/src/xml_study/contacts.xml");

//创建一个文档对象

Document document  = newDocumentBuilder.parse(file);

//获得节点的根root

org.w3c.dom.Element root = document.getDocumentElement();

org.w3c.dom.Element createElement = document.createElement("linkman");

org.w3c.dom.Element createElement2 = document.createElement("name");

createElement2.setTextContent("梓沐");

org.w3c.dom.Element createElement3 = document.createElement("email");

createElement3.setTextContent("56.@qq.com");

org.w3c.dom.Element createElement4 = document.createElement("address");

createElement4.setTextContent("锦江区");

org.w3c.dom.Element createElement5 = document.createElement("group");

createElement5.setTextContent("10组");

createElement.setAttribute("id", "00000");

root.appendChild(createElement);

createElement.appendChild(createElement2);

createElement.appendChild(createElement3);

createElement.appendChild(createElement4);

createElement.appendChild(createElement5);

Transformer transformer = TransformerFactory.newInstance().newTransformer();

transformer.transform(new DOMSource(document), new StreamResult(file));

/*

* 删除节点

*  Node removeChild(Node oldChild)  从子节点列表中移除 oldChild 所指示的子节点,并将其返回,必须通过父节点返回。

*  Node getParentNode()  此节点的父节点。

* 我们要删除名叫梓沐的节点

*/

}

@Test

public void testDelete() throws ParserConfigurationException, SAXException, IOException, TransformerException {

//创建文档建造者工厂对象

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

//创建文档建造者对象

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

File file = new File("D:/JAVEEworkspace/xml_study/src/xml_study/contacts.xml");

//创建解析了指定文件的文档对象

Document document = documentBuilder.parse(file);

//获得标签名为name的所有节点

NodeList elements= document.getElementsByTagName("name");

/*

* for循环去除所有的name节点并得到相应的文本节点,然后与“梓沐”比较,

* 如果相等则获得这个节点的父节点来删除这个子节点

*/

for (int i = 0; i < elements.getLength(); i++) {

if(elements.item(i).getTextContent().equals("梓沐")){

System.out.println(elements.item(i).getTextContent());

elements.item(i).getParentNode().removeChild(elements.item(i));

}

}

//获得转换器对象

TransformerFactory newInstance = TransformerFactory.newInstance();

Transformer transformer = newInstance.newTransformer();

transformer.transform(new DOMSource(document), new StreamResult(file));

}

}

三、dom4j解析XML文档(都需要导jar包)

1、使用源生dom4j解析文档

代码示例

public class DOM4JTest {

File file = new File("D:/JAVEEworkspace/xml_study/src/xml_dom4j/contacts.xml");

//方法一:使用原生dom4j解析xml文档

@Test

public void test() throws DocumentException {

/*

* 使用原生dom4j解析xml文档必须创建dom4j核心对象

*/

SAXReader reader = new SAXReader();

//创建一个读取了指定文档的document对象

Document document = reader.read(file);

//获取root节点

Element root= document.getRootElement();

/*

*  List elements(标签名) 获取下一级的多个标签,返回集合对象

* String elementText(标签名) 返回标签中的文本数据

* Element element(标签名) 获取下一级的单个标签,返回第一个

*/

List elements = root.elements("linkman");

System.out.println(elements);

//获取第一个linkman标签

Element element = (Element)elements.get(0);

//获取linkman标签下的第一个name标签

Element element2 = element.element("name");

//获取name标签的文本

String text = element2.getText();

System.out.println(text);

}

2、使用dom4j中的xpath解析XMl文档

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath 是一门在 XML 文档中查找信息的语言。

代码示例

@Test

public void test1() throws DocumentException {

//创建dom4j核心对象

SAXReader reader = new SAXReader();

//创建一个读取了指定文档的document对象

Document read = reader.read(file);

//通过xpath获取指定的元素(默认是第一个)

Node node = read.selectSingleNode("//linkman[2]/name");

String text = node.getText();

System.out.println(text);

}

/*

* 修改值

*/

@Test

public void test2() throws DocumentException, IOException {

SAXReader reader = new SAXReader();

Document document = reader.read(file);

Node node = document.selectSingleNode("//linkman/name");

node.setText("梓沐");

System.out.println(node.getText());

//将内存里面的数据同步到磁盘(创建一个字节输出流的dom4j的转换流对象)

XMLWriter writer = new XMLWriter(new FileOutputStream(file));

writer.write(document);

writer.close();//上面创建了一个转换流对象,因此要关闭流

}

/*

* 增加元素(一步一步增加)

*/

@Test

public void test3() throws DocumentException, IOException {

SAXReader reader = new SAXReader();

Document read = reader.read(file);

//获取根节点

Element root = read.getRootElement();

Element linkman = root.addElement("linkman");

Element id = linkman.addAttribute("id", "666");

linkman.addElement("name").setText("你好");

linkman.addElement("email").setText("444.@qq.com");

linkman.addElement("address").setText("中国");

linkman.addElement("group").setText("北京");

//创建漂亮格式

OutputFormat format = OutputFormat.createPrettyPrint();

XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);

writer.write(read);

writer.close();

}

/*

* 删除指定元素(还是要用到父类元素来删除子类元素)

*/

@Test

public void test4() throws DocumentException, IOException {

SAXReader reader = new SAXReader();

Document document = reader.read(file);

Node node = document.selectSingleNode("//linkman[2]/name");

Element parentNode = node.getParent();

boolean remove = parentNode.remove(node);

System.out.println(remove);

//创建一个输出的漂亮格式

OutputFormat format = OutputFormat.createPrettyPrint();

XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);

writer.write(document);

writer.close();

}

四、XML约束

1、XML约束的目的:规范XML中书写的内容,XML约束分为:DTD约束、Schema约束

2、DTD约束

DTD约束文件与XML文件关联

<!DOCTYPE contacts SYSTEM “contacts.dtd”>

注意:DTD约束中若出现错误,不会报错

3、Schema约束

Schema约束文件与XML文件关联

<contacts xmlns="http://itsource.cn"

xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"

xs:schemaLocation="http://itsource.cn  contactsSchema.xsd">

Schema约束本质上来说,是一个XML,Schema约束和DTD约束最大的区别就在于:前者使用XML语法来约束Schema本身的内容,即使写错也会报错,但Schema同样也存在致命的缺点,那就是约束本身语法实在有些复杂。

五、DOM模型

DOM(Document Object Model)文档对象模型。直白的讲就是Java程序解析结构化文档的时候,在内存中生成的包含当前结构化文档所有内容的一个对象模型。所以说DOM并不是一门技术,而是一门思想,或者更明确的讲是一门访问结构化文档的一种方式。那么当前我们学过的结构化文档有HTML、XML。DOM模型实际上描述的就是标签之间的层级结构。

源生API解析XML文档与dom4j解析XML文档的更多相关文章

  1. java解析xml字符串为实体(dom4j解析)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  2. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  3. XML案例(使用DOM4J解析XML文档)

    1.Demo1.java package cn.itcast.dom4j; import java.io.File;import java.io.FileOutputStream;import jav ...

  4. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  5. java基础 xml 使用dom4j解析 xml文件 servlet根据pattern 找到class

    package com.swift.kaoshi; import java.io.File; import java.util.List; import java.util.Scanner; impo ...

  6. JavaWeb_使用dom4j解析、生成XML文件

    dom4j 官网 xml解析DOM文档对象模型(树形结构) DOM方式解析:把xml文档加载到内存形成树形结构,可以进行增删改的操作 Learn   使用dom4j解析文件"NewFile. ...

  7. java学习笔记DOM4J解析(7)

    DOM4J即Document Object Model for Java使用java技术以文档方式解析XML数据的模型. DOM4J是开源组织提供的一个免费的.强大的XML解析工具,如果开发者需要在项 ...

  8. Dom4j下载及使用Dom4j读写XML简介(转)

    Dom4j下载及使用Dom4j读写XML简介 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:ht ...

  9. Java开发笔记(一百零九)XML报文的定义和解析

    前面介绍了JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型. ...

随机推荐

  1. Unity下载

    Unity下载 Mac OS或Windows操作系统都可以使用对应的Unity版本进行开发 Unity引擎的官方网站:http://www.unity3d.com 官方下载地址:http://unit ...

  2. 原型模式-Prototype(Java实现)

    原型模式-Prototype 通过复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象. 就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕 ...

  3. 【转载】C++ STL快速入门

    https://www.cnblogs.com/skyfsm/p/6934246.html

  4. vue 开发和生产的跨域问题

    开发阶段 在开发环境与后端调试的时候难免会遇到跨域问题,在 vue 项目中常用的是 proxyTable,这个用起来很方便. 打开 config 文件夹下面的 index.js,找到 dev 开发模式 ...

  5. 通过scrollTop,使子元素滚动至指定位置

    想实现这样的一个功能,点击子元素,让元素滚动至指定位置,怎么实现呢? 在代码实现之前,先了解下相关关键点. 1.scrollHeight 属性 通过 scrollHeight 属性可获得子元素的滚动高 ...

  6. JAVA学习笔记(3)—— 抽象类与接口

    1. Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类 ...

  7. TV 丽音(NICAM)功能

    丽音意谓「接近即时的缩扩音频多路广播」 丽音使用数码技术,把电视台发送的两条音频讯号数码化后进行压缩,传送后再在接收机里扩大还原.数码化使用的是14位元 PCM,32千赫采样. 这种广播法可以播出优质 ...

  8. 网络流板子/费用流板子 2018南京I题+2016青岛G题

    2018南京I题: dinic,链式前向星,数组队列,当前弧优化,不memset全部数组,抛弃满流点,bfs只找一条增广路,每次多路增广 #include <bits/stdc++.h> ...

  9. jmeter测试报告分析

    转载:http://www.cnblogs.com/miaomiaokaixin/p/6118081.html 在cmd中用命令行执行jmeter脚本: jmeter地址  -n -t  脚本地址  ...

  10. Spring Tools4

    Spring Tools4是一个集成了STS插件的Eclipse,所以下载之后就不需要再下载eclipse. 访问 https://spring.io/tools/ 点击“Download STS4 ...