任何安装的软件,都不要使用中文路径和带空格等特殊字符的路径。
最好专门用一个盘来存储工作上的内容。
用一个专门的文件夹来存储和管理安装的软件。
对数组进行最大最小值判断时,初始值最好使用数组中的值。
XML 英文全称为ExtensibleMarkup Language
-
在XML语言中,它允许用户自定义标签。每一个标签用于描述一段数据;
-
一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间又可以嵌套其它标签,利用标签间的嵌套关系来保存数据之间的上下级关系;
-
由于xml实质上是一段字符串,计算机可以十分方便的对他进行操作,开发人员也可以方便的阅读,因此可以说这是一种对人、对计算机都友好的数据存储格式,所以XML迅速普及,成为了一种非常常见的数据存储格式,在许多应用场景中得到应用。
XML:用来存储和传递数据的。
XML本质上是一种数据存储格式。
在XML中,所有标签都必须是闭合的。
XML中标签可以嵌套出现,但是不允许交叉出现。
XML本质上是一段字符串,具有跨平台性。因此XML经常用来在不同系统之间进行传递数据。XML也会被用作一些应用程序的配置文件。
XML中的数据,具有层次性。
在一些特殊情况下xml也可以用作数据库的替代工具来使用。
-
XML是一种存储数据的格式,我们可以将遵照这种数据格式写出来的XML数据保存到一个文件中去,并将文件的后缀名设定为.xml,那么这样的保存了XML数据的文件就叫做xml文件。
-
xml文件是保存XML数据的一种方式,XML数据也可以以其他的方式存在(如在内存中构建XML数据),不要将XML语言狭隘的理解成xml文件。
浏览器中一般都内置了xml解析器。可以用浏览器直接打开xml文件来对xml文件进行校验。
xml的语法:
-
一个XML文件分为如下几部分内容:
-
文档声明
-
元素
-
属性
-
注释
-
CDATA区、特殊字符
-
处理指令(processinginstruction)
-
-
XML的文档声明是用来声明文档基本属性的,XML解析器将根据文档声明决定如何正确解析一个XML
-
通常来说一个XML必须包含且只包含一个文档声明
-
文档声明必须处在XML的第一行,前面不能有其他内容
-
如果一个XML不包含文档声明则称这样的XML为格式不良好的XML
-
在许多时候即使不包含文档声明,XML也可以被正常使用,但是这是不符合标准的,存在风险,因此强烈推荐大家在书写XML时写上文档声明。
-
-
最简单写法:
-
<?xml version="1.0" ?>
-
version 代表当前xml所遵循的xml标准。
-
在第二个问号之前应该有一个空格
-
注意:问号、引号、空格都必须为英文半角
-
-
用encoding属性说明文档的字符编码:
-
<?xml version="1.0" encoding="GB2312" ?>
-
encoding告知解析器使用何种编码解析当前xml
-
encoding默认值为ISO8859-1
-
-
用standalone属性说明文档是否独立:
-
<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
-
standalone表示当前xml文档是否是一个独立文档,当为yes时表示是一个独立文档,当为no时表示当前文档需要其他文档支持。
xml元素
-
-
一个XML标签就是一个XML元素。
-
一个XML标签分为开始标签和结束标签,在开始标签和结束标签之间的文本被称为标签体。
-
包含标签体:<a>www.baidu.cn</a>
-
-
如果一个不包含标签体也不包含其他元素,那么可以将开始标签和结束标签合并,这样的标签称为自闭标签
-
不含标签体及其他元素:<a></a>可以简写为自闭标签:<a/>
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套
-
-
格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
-
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
-
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
-
区分大小写,例如,<P>和<p>是两个不同的标记。
-
不能以数字或标点符号或"_"开头。
-
不能以xml(或XML、或Xml 等)开头。
-
不能包含空格。
-
名称中间不能包含冒号(:)。
-
-
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<chinacapital="beijing"/>
-
属性值一定要用双引号(")或单引号(')引起来
<chinacapital='beijing'/>
-
定义属性名必须遵循与元素相同的命名规范
-
Xml文件中的注释采用:“<!--注释-->” 格式。
-
注释不能出现在文档声明之前(因为XML要求文档声明必须在第一行,之前不能有其他内容)
实验:
分别使用ie和chrome测试文档声明前出现注释的情况
-
注释不能嵌套,例如:
<!--大段注释
……
<!--局部注释-->
……
-->
CDATA区
-
当XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住
-
当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析
-
语法:<![CDATA[内容 ]]>
-
场景一:在输入框中输入的用户名,密码,使用XML保存传递到后台。
Xml文档申明之前不能有任何内容
注释不能写在标签之间
只用来展示内容的少部分特殊字符用转意字符
大量的转意字符的使用,用CDATA区域
转义字符
处理指令:
-
处理指令,简称PI (processinginstruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
-
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。 <?xml-stylesheet type="text/css"href="1.css"?>
-
处理指令必须以“<?”作为开头,以“?>”作为结尾,
-
XML文档声明语句就是最常见的一种处理指令。
Xml约束
-
什么是XML约束?
-
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束。
-
-
XML约束的作用
-
约束xml文档的写法
-
对xml进行校验
-
-
常见的XML约束技术
XML DTD
XML Schema
DTD(Document Type Definition),全称为文档类型定义。
在解析xml的时候,一般都需要去除表情内容中的字符串内容前后的空格
默认情况下,ie浏览器的xml校验是关闭的,必须通过Javascrip脚本开启xml校验
var xmldom = new ActiveXObject(“Microsft.XMLDOM”)
xmldom.validateOnParse = “true”;
xmldom.load(文件);//加载要校验的文件
var msg = xmldom.parseError.reason;
var line = xmldom.parseError.line;
document.write(“错误所在行”+line);
document.write(“<br/>”);
document.write(“错误信息”+msg);
引入DTD约束的两种方式
-
DTD的约束可以定义在XML文件内部,如果DTD被定义在了XML内部则XML文档声明中standalone="yes"
-
DTD的约束也可以定义在一个独立的后缀为.dtd的文件中再由xml文件引入,此时引入此dtd的xml文档声明中standalone="no"
-
注意:.dtd文件应使用UTF-8或Unicode编码
-
XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:
-
当引用的文件在本地时,采用如下方式:
<!DOCTYPE文档根结点 SYSTEM "DTD文件的URL">
例如:<!DOCTYPE书架 SYSTEM “book.dtd”>
-
-
当引用的文件是一个公共的文件时,采用如下方式:
<!DOCTYPE文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
例如:<!DOCTYPEweb-app PUBLIC
"-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
xml文件的学习重点,CRUD
主流的xml解析方式:DOM方式和SAX解析方式。
DOM解析方式:把整个xml文档读入到内存中,每一个内容都创建一个对象来与之对应。
在Dom解析过程中,会创建一个document对象来代表整个文档。xml文档的根标签会挂载在document对象之下,其他标签挂载在根标签下。
整个xml文档在dom解析过程中会形成一个倒立的文档树。
在dom解析过程中标签的每个属性,都会被解析成一个对象。
dom解析过程中,一个节点可以任意访问其他节点的。
dom解析的缺点:占用内存比较大 第一次解析时比较耗费时间
dom解析的优点:方便的对节点进行增删改查操作。只需解析一次,可以多次获取数据。
Dom解析是一种思想
document对应于 ----Document
根标签对应于 ---Element
标签体内容对应于 ---CharacterData
表情属性对应于 ---Attributed Attr
在XML中所有的节点都是Node的子类或者子接口。
在dom解析过程中所有的xml节点都可以进行增删改查的操作
SAX解析方式:
SAX解析主要包括解析器和事件处理器。
解析器负责逐行扫描xml文档,每发现一个内容,都会去调用文档解析开始的方法。
发现标签体时,调用发现标签的方法。
发现结束标签时,调用结束标签的处理方法
最后调用文档解析结束的方法。
事件处理器负责处理对应的事情。
属性会被当作开始标签的参数传入到开始标签处理方法中。
优点:占用内存少,解析速度快
缺点:每次都要重新解析。只能进行查找数据的操作,不能进行增删操作。
可以通过对象来存储解析内容。
SAX解析xml的案例
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SaxDemo {
public static void main(String[] args) throws ParserConfigurationException,SAXException, IOException {
// TODO Auto-generatedmethod stub
//创建解析器工厂
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
//获取解析器对象
SAXParser parse =saxFactory.newSAXParser();
//获取xml读取器
XMLReader xmlReader =parse.getXMLReader();
//设置时间处理器
xmlReader.setContentHandler(new MyContentHandler());
//读取xml文件
xmlReader.parse("book.xml");
}
}
class MyContentHandler extends DefaultHandler{
private String elementName="";
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generatedmethod stub
if ("书名".equals(elementName)) {
String str = new String(ch,start,length);
System.out.println(str);
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generatedmethod stub
elementName = qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generatedmethod stub
elementName = "";
}
}
JAXP解析xml
-
-
JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
-
javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象, DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
-
调用 DocumentBuilderFactory.newInstance()方法得到创建 DOM 解析器的工厂。
DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();
-
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
DocumentBuilderbuilder = builderFactory.newDocumentBuilder();
-
调用 DOM 解析器对象的 parse()方法解析 XML 文档,得到代表整个文档的Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
Documentdoc = builder.parse(new File("book.xml"));
案例
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class JaxpDemo {
public static void main(String[] args) throws ParserConfigurationException,SAXException, IOException {
// TODO Auto-generatedmethod stub
//创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//设置需要解析的文档,获取文档解析对象
Document document =builder.parse("book.xml");
//获取根节点
//Element root = document.getDocumentElement();
//根据标签名获取元素
NodeList booklist = document.getElementsByTagName("书名");
//根据脚标,获取书(元素)
Element book = (Element) booklist.item(0);
//获取标签体
String bookname = book.getTextContent();
System.out.println(bookname);
}
}
DOM编程
-
DOM模型(document object model)
-
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点),并以树的结构组织起来,存储到内存中。
-
JAXP中的文档对象:
-
Document:文档
-
Element:元素
-
Attr:属性
-
CharacterData:标签体
-
-
Node接口
-
-
Node是一个接口,代表文档树中的单个节点,其他文档类都是Node接口的实现
-
Node接口上提供了获取父节点、获取子节点的方法,由此可以遍历文档树。
-
Node接口定义了增删改查节点方法由此可以修改文档树。
-
Node getFirstChild()
-
此节点的第一个子节点。
-
Node getLastChild()
-
此节点的最后一个节点。
getAttributes() -
包含此节点的属性的NamedNodeMap(如果它是 Element);否则为 null。
-
Node appendChild(NodenewChild)
将节点 newChild 添加到此节点的子节点列表的末尾。
-
NodeList getChildNodes()
包含此节点的所有子节点的 NodeList。
getAttributes()
包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null。
-
Node removeChild(NodeoldChild)
从子节点列表中移除oldChild 所指示的子节点,并将其返回。
-
Node replaceChild(NodenewChild, Node oldChild)
将子节点列表中的子节点 oldChild 替换为 newChild,并返回 oldChild 节点。
-
void setTextContent(StringtextContent)
此属性返回此节点及其后代的文本内容。
-
对文档树的增删该查只是对内存中的对象进行的操作,如果希望将修改对xml文件起作用,就需要进行XML文档更新
-
javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
-
获取Transformer工厂
TransformerFactorytransformerFactory = TransformerFactory.newInstance();
-
-
获取Transfomer对象
Transformertransformer = transformerFactory.newTransformer();
-
-
创建代表输入和输出的Source和Result对象
Sourcesource = new DOMSource(doc);
Resultresult = new StreamResult(new FIle("book.xml"));
-
-
使用Transformer将 XMLSource 转换为 Result
transformer.transform(source, Result);
看开源jar包之后的学习步骤:(下载开源jar包,解压后找到docs)
-
-
引入核心jar包
-
查看快速使用案例
-
查看快速使用案例中用到的类的作用和使用方法
-
自己做出一个案例来