任何安装的软件,都不要使用中文路径和带空格等特殊字符的路径。
最好专门用一个盘来存储工作上的内容。
用一个专门的文件夹来存储和管理安装的软件。
@H_301_29@
对数组进行最大最小值判断时,初始值最好使用数组中的值。
@H_301_29@
@H_301_29@XML 英文全称为@H_301_29@ExtensibleMarkup Language
@H_301_29@
-
一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间又可以嵌套其它标签,利用标签间的嵌套关系来保存数据之间的上下级关系;
- 由于@H_301_29@xml实质上是一段字符串,计算机可以十分方便的对他进行操作,开发人员也可以方便的阅读,因此可以说这是一种对人、对计算机都友好的数据存储格式,所以@H_301_29@XML迅速普及,成为了一种非常常见的数据存储格式,在许多应用场景中得到应用。
@H_301_29@
@H_301_29@XML:用来存储和传递数据的。
@H_301_29@XML本质上是一种数据存储格式。
@H_301_29@XML中标签可以嵌套出现,但是不允许交叉出现。
@H_301_29@XML本质上是一段字符串,具有跨平台性。因此@H_301_29@XML经常用来在不同系统之间进行传递数据。@H_301_29@XML也会被用作一些应用程序的配置文件。
@H_301_29@XML中的数据,具有层次性。
在一些特殊情况下@H_301_29@xml也可以用作数据库的替代工具来使用。
@H_301_29@
- @H_301_29@XML是一种存储数据的格式,我们可以将遵照这种数据格式写出来的@H_301_29@XML数据保存到一个文件中去,并将文件的后缀名设定为@H_301_29@.xml,那么这样的保存了@H_301_29@XML数据的文件就叫做@H_301_29@xml文件。
- @H_301_29@xml文件是保存@H_301_29@XML数据的一种方式,@H_301_29@XML数据也可以以其他的方式存在(如在内存中构建@H_301_29@XML数据),不要将@H_301_29@XML语言狭隘的理解成@H_301_29@xml文件。
浏览器中一般都内置了@H_301_29@xml解析器。可以用浏览器直接打开@H_301_29@xml文件来对@H_301_29@xml文件进行校验。
@H_301_29@xml的语法:
- 一个@H_301_29@XML文件分为如下几部分内容:
- @H_301_29@XML的文档声明是用来声明文档基本属性的,@H_301_29@XML解析器将根据文档声明决定如何正确解析一个@H_301_29@XML
- 最简单写法:
- 用@H_301_29@encoding属性说明文档的字符编码:
- 用@H_301_29@standalone属性说明文档是否独立:
- 一个@H_301_29@XML标签就是一个@H_301_29@XML元素。
- 一个@H_301_29@XML标签分为开始标签和结束标签,在开始标签和结束标签之间的文本被称为标签体。
- 如果一个不包含标签体也不包含其他元素,那么可以将开始标签和结束标签合并,这样的标签称为自闭标签
- 由于在@H_301_29@XML中,空格和换行都作为原始内容被处理,所以,在编写@H_301_29@XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
- 一个@H_301_29@XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
- 定义属性名必须遵循与元素相同的命名规范
@H_301_29@Xml文件中的注释采用:@H_301_29@“@H_301_29@<!--注释@H_301_29@-->” 格式。
- 注释不能出现在文档声明之前(因为@H_301_29@XML要求文档声明必须在第一行,之前不能有其他内容)
@H_301_29@ 实验:
- 注释不能嵌套,例如:
@H_301_29@ <!--大段注释
@H_301_29@ ……
@H_301_29@ <!--局部注释@H_301_29@-->
@H_301_29@ -->
@H_301_29@CDATA区
- 当@H_301_29@XML中一段内容不希望被解析器解析时可以使用@H_301_29@CDATA区将其包住
- 当解析器遇到@H_301_29@CDATA区时会将其内容当作文本对待,不会进行解析
- 语法:@H_301_29@<![CDATA[内容 @H_301_29@]]>
- 场景一:在输入框中输入的用户名,密码,使用@H_301_29@XML保存传递到后台。
注释不能写在标签之间
只用来展示内容的少部分特殊字符用转意字符
大量的转意字符的使用,用@H_301_29@CDATA区域
转义字符
处理指令:
- 处理指令,简称@H_301_29@PI (@H_301_29@processinginstruction)。处理指令用来指挥解析引擎如何解析@H_301_29@XML文档内容。
- 例如,在@H_301_29@XML文档中可以使用@H_301_29@xml-stylesheet指令,通知@H_301_29@XML解析引擎,应用@H_301_29@css文件显示@H_301_29@xml文档内容。@H_301_29@ <?xml-stylesheet type="text/css"href="1.css"?>
- 处理指令必须以“@H_301_29@<?”作为开头,以“@H_301_29@?>”作为结尾,
- @H_301_29@XML文档声明语句就是最常见的一种处理指令。
@H_301_29@Xml约束
- 什么是@H_301_29@XML约束?
- @H_301_29@XML约束的作用
- 常见的@H_301_29@XML约束技术
@H_301_29@XML DTD
@H_301_29@XML Schema
@H_301_29@DTD(Document Type Definition),全称为文档类型定义。
在解析@H_301_29@xml的时候,一般都需要去除表情内容中的字符串内容前后的空格
默认情况下,@H_301_29@ie浏览器的@H_301_29@xml校验是关闭的,必须通过@H_301_29@Javascrip脚本开启@H_301_29@xml校验
@H_301_29@varxmldom = new ActiveXObject(“Microsft.XMLDOM”)
@H_301_29@xmldom.validateOnParse = “true”;
@H_301_29@xmldom.load(文件@H_301_29@);//加载要校验的文件
@H_301_29@var msg = xmldom.parseError.reason;
@H_301_29@var line = xmldom.parseError.line;
@H_301_29@document.write(“错误所在行@H_301_29@”+line);
@H_301_29@document.write(“<br/>”);
@H_301_29@document.write(“错误信息@H_301_29@”+msg);
引入@H_301_29@DTD约束的两种方式
- @H_301_29@DTD的约束可以定义在@H_301_29@XML文件内部,如果@H_301_29@DTD被定义在了@H_301_29@XML内部则@H_301_29@XML文档声明中@H_301_29@standalone="yes"
- @H_301_29@DTD的约束也可以定义在一个独立的后缀为@H_301_29@.dtd的文件中再由@H_301_29@xml文件引入,此时引入此@H_301_29@dtd的@H_301_29@xml文档声明中@H_301_29@standalone="no"
- 注意:@H_301_29@.dtd文件应使用@H_301_29@UTF-8或@H_301_29@Unicode编码
@H_301_29@XML文件使用@H_301_29@ DOCTYPE 声明语句来指明它所遵循的@H_301_29@DTD文件,@H_301_29@DOCTYPE声明语句有两种形式:
- 当引用的文件是一个公共的文件时,采用如下方式:@H_301_29@
@H_301_29@ <!DOCTYPE文档根结点@H_301_29@ PUBLIC "DTD名称@H_301_29@" "DTD文件的@H_301_29@URL">
@H_301_29@ 例如:@H_301_29@<!DOCTYPEweb-app PUBLIC
@H_301_29@ "-//SunMicrosystems,Inc.//DTD Web Application 2.3//EN"
@H_301_29@ "http://java.sun.com/dtd/web-app_2_3.dtd">
@H_301_29@xml文件的学习重点,@H_301_29@CRUD
主流的@H_301_29@xml解析方式:@H_301_29@DOM方式和@H_301_29@SAX解析方式。
@H_301_29@DOM解析方式:把整个@H_301_29@xml文档读入到内存中,每一个内容都创建一个对象来与之对应。
在@H_301_29@Dom解析过程中,会创建一个@H_301_29@document对象来代表整个文档。@H_301_29@xml文档的根标签会挂载在@H_301_29@document对象之下,其他标签挂载在根标签下。
整个@H_301_29@xml文档在@H_301_29@dom解析过程中会形成一个倒立的文档树。
在@H_301_29@dom解析过程中标签的每个属性,都会被解析成一个对象。
@H_301_29@dom解析过程中,一个节点可以任意访问其他节点的。
@H_301_29@dom解析的缺点:占用内存比较大@H_301_29@ 第一次解析时比较耗费时间
@H_301_29@dom解析的优点:方便的对节点进行增删改查操作。只需解析一次,可以多次获取数据。
@H_301_29@Dom解析是一种思想@H_301_29@
@H_301_29@document对应于@H_301_29@ ----Document
标签体内容对应于@H_301_29@ ---CharacterData
表情属性对应于@H_301_29@ ---Attributed Attr
在@H_301_29@XML中所有的节点都是@H_301_29@Node的子类或者子接口。
在@H_301_29@dom解析过程中所有的@H_301_29@xml节点都可以进行增删改查的操作
@H_301_29@SAX解析方式:
解析器负责逐行扫描@H_301_29@xml文档,每发现一个内容,都会去调用文档解析开始的方法。
事件处理器负责处理对应的事情。
优点:占用内存少,解析速度快
缺点:每次都要重新解析。只能进行查找数据的操作,不能进行增删操作。
可以通过对象来存储解析内容。
@H_301_29@SAX解析@H_301_29@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 = "";
}
}
- @H_301_29@JAXP 开发包是@H_301_29@J2SE的一部分,它由@H_301_29@javax.xml、@H_301_29@org.w3c.dom 、@H_301_29@org.xml.sax 包及其子包组成
- @H_301_29@javax.xml.parsers 包中的@H_301_29@DocumentBuilderFactory用于创建@H_301_29@DOM模式的解析器对象, @H_301_29@DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个@H_301_29@newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
调用 @H_301_29@DocumentBuilderFactory.newInstance()方法得到创建 @H_301_29@DOM 解析器的工厂。
@H_301_29@ DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();
- 调用工厂对象的 @H_301_29@newDocumentBuilder方法得到 @H_301_29@DOM 解析器对象。
@H_301_29@ DocumentBuilderbuilder = builderFactory.newDocumentBuilder();
- 调用 @H_301_29@DOM 解析器对象的 @H_301_29@parse()方法解析 @H_301_29@ XML 文档,得到代表整个文档的@H_301_29@Document 对象,进行可以利用@H_301_29@DOM特性对整个@H_301_29@XML文档进行操作了。
@H_301_29@ 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);
}
@H_301_29@DOM编程
- @H_301_29@Node是一个接口,代表文档树中的单个节点,其他文档类都是@H_301_29@Node接口的实现
- @H_301_29@Node接口上提供了获取父节点、获取子节点的方法,由此可以遍历文档树。
- @H_301_29@Node接口定义了增删改查节点方法由此可以修改文档树。
@H_301_29@Node getFirstChild()
- @H_301_29@此节点的第一个子节点。
- @H_301_29@Node getLastChild()
- @H_301_29@此节点的最后一个节点。@H_301_29@
getAttributes() - @H_301_29@包含此节点的属性的@H_301_29@NamedNodeMap(如果它是@H_301_29@ Element);否则为@H_301_29@ null。
- @H_301_29@Node appendChild(NodenewChild)
- @H_301_29@NodeList getChildNodes()
@H_301_29@ 包含此节点的所有子节点的@H_301_29@ NodeList。
@H_301_29@getAttributes()
@H_301_29@包含此节点的属性的@H_301_29@ NamedNodeMap(如果它是@H_301_29@ Element);否则为@H_301_29@ null。
- @H_301_29@Node replaceChild(NodenewChild,Node oldChild)
@H_301_29@ 将子节点列表中的子节点@H_301_29@ oldChild 替换为@H_301_29@ newChild,并返回@H_301_29@ oldChild 节点。
- @H_301_29@void setTextContent(StringtextContent)
对文档树的增删该查只是对内存中的对象进行的操作,如果希望将修改对@H_301_29@xml文件起作用,就需要进行@H_301_29@XML文档更新
- @H_301_29@javax.xml.transform包中的@H_301_29@Transformer类用于把代表@H_301_29@XML文件的@H_301_29@Document对象转换为某种格式后进行输出