任何安装的软件,都不要使用中文路径和带空格等特殊字符的路径。
最好专门用一个盘来存储工作上的内容。
用一个专门的文件夹来存储和管理安装的软件。
对数组进行最大最小值判断时,初始值最好使用数组中的值。
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文件分为如下几部分内容:
- 文档声明
- 元素
- 属性
- 注释
- 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>
- 如果一个不包含标签体也不包含其他元素,那么可以将开始标签和结束标签合并,这样的标签称为自闭标签
- 由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
- 一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
- 属性值一定要用双引号(")或单引号(')引起来
<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校验
varxmldom = new ActiveXObject(“Microsft.XMLDOM”)
xmldom.validateOnParse = “true”;
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编码
- 当引用的文件是一个公共的文件时,采用如下方式:
<!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解析是一种思想
document对应于 ----Document
根标签对应于 ---Element
表情属性对应于 ---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 {
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());
读取文件
xmlReader.parse("book.xml");
}
}
class MyContentHandler extends DefaultHandler{
private String elementName="";
@Override
void characters(char[] ch,int start,85); font-family:'Courier New'; font-size:12pt">int length)
throws SAXException {
Auto-generatedmethod stub
if ("书名".equals(elementName)) {
String str = new String(ch,start,length);
System.out.println(str);
}
}
void startElement(String uri,String localName,String qName,
Attributes attributes) Auto-generatedmethod stub
elementName = qName;
}
void endElement(String uri,String qName)
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 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;
class JaxpDemo {
创建解析器工厂
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)
- 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)
- javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
- 获取Transformer工厂
TransformerFactorytransformerFactory = TransformerFactory.newInstance();
- 获取Transformer工厂
- 获取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)