用自己的语言说出,为什么需要 XML?
XML 是一种元标注语言,该语言提供一种描述结构数据的格式。这有助于更精确地声明内容,方便跨越多种平台的更有意义的搜索结果。此外,XML 将起用新一代的基于 Web 的数据查看和处理应用程序。
XML 提供可以广泛执行并易于配置的数据的结构表示。XML 是 万维网协会(W3C) 定义的用于优化 Web 上的传输的 SGML 的子集,XML 确保结构数据是一致的并独立于应用程序或供应商。由此产生的互用性正在启动新一代的商业和电子商务 Web 应用程序。
XML 提供可以编码各种情况(从简单至复杂)的内容、语义和架构的数据标准,可被用于标注以下对象:
普通文档。
诸如约会记录或采购定单之类的结构记录。
具有数据和方法的对象,如 Java 对象或 ActiveX 控件的持续型表单。
数据记录,如查询的结果集。
有关 Web 站点的元内容,如“频道定义格式 (CDF)”。
图形表示,如应用程序的用户界面。
标准架构实体和类型。
Web 上的信息与用户之间的所有链接。
用自己的话描述 XML 有什么作用?
XML 把数据从 HTML 分离
如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。
通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。
通过使用几行 JavaScript,你就可以读取一个外部 XML 文件,然后更新 HTML 中的数据内容。
XML 简化数据共享
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。
XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
这让创建不同应用程序可以共享的数据变得更加容易。
XML 简化数据传输
通过 XML,可以在不兼容的系统之间轻松地交换数据。
对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。
由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。
XML 简化平台的变更
升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。
XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。
XML 使您的数据更有用
XML 用于创建新的 Internet 语言
很多新的 Internet 语言是通过 XML 创建的:
其中的例子包括:
XHTML - 最新的 HTML 版本
WSDL - 用于描述可用的 web service
WAP 和 WML - 用于手持设备的标记语言
RSS - 用于 RSS feed 的语言
RDF 和 OWL - 用于描述资源和本体
SMIL - 用于描述针针对 web 的多媒体
XML文件的基本语法要求有哪些?
】 1、注释
XML的注释与HTML的注释相同,以“ ”结束。
2、区分大小写
在HTML中是不区分大小写的,而XML区分大小写,包括标记,属性,指令等。
3、标记
XML标记与HTML标记相同,“<”表示一个标记的开始,“>” 表示一个标记的结束。XML中只要有起始标记,就必须有结束标记,而且在使用嵌套结构时,标记之间不能交叉。
在XML中不含任何内容的标记叫做空标记,格式为:<标记名称/>
4、属性
XML属性的使用与HTML属性基本相同,但需要注意的是属性值要加双引号。
5、实体引用
实体引用是指分析文档时会被字符数据取代的元素,实体引用用于XML文档中的特殊字符,否则这些字符会被解释为元素的组成部分。例如,如果要显示“<”,需要使用实体引用“<”否则会被解释为一个标记的起始。
XML中有5个预定义的实体引用
6、CDATA
在XML中由一个特殊的标记CDATA,在CDATA中所有文本都不会被XML处理器解释,直接显示在浏览器中,使用方法如下:
<![CDATA[ 这里的内容可以直接显示。 ]]>7、处理指令
处理指令使用来给处理XML文件的应用程序提供信息的,处理指令的格式如下:
<?处理指令名称 处理指令信息?> 例如,XML声明就是一条处理指令:
<?xml version="1.0" encoding="gb2312"?>
其中,“xml”是处理指令名称,version=“1.0” encoding="gb2312"是处理指令信息。
**dtd技术有什么作用? schema技术什么作用?二者之间有什么关系?
DTD在页面中的作用
①DTD(Document Type Definition文档类型定义)是一组机器可读的规则,它们定义XML或HTML的特定版本中允许有什么,不允许有什么。在解析网页时,浏览器将使用这些规则检查页面的有效性并且采取相应的措施。(由DTD中定义的文档类型影响)
②DTD是对HTML文档声明,还会影响浏览器的渲染模式(工作模式)。(由页面中书写DTD的方式影响)
DTD规定XML或HTML中的标签和语法
1)HTML 4.01规定了三种文档类型:Strict、Transitional 以及 Frameset
2)XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。
3)HTML5只规定了一种文档类型:
DTD会影响浏览器的渲染模式:
Schema的作用:
· 定义与作用
Schema描述XML文档的结构
是基于XML的DTD替代者
Schema也称为:XML Schema Definition(XSD)
Schema要比DTD更强大
· Schema与DTD的异同
Schema是DTD的继任者
Schema将来会取代DTD
Schema优势:
针对未来的需求进行扩展
更加完善,功能更加强大
基于XML编写
支持数据类型
使用XML的语法
由XML编写Schema有很多好处
不必学习新的语言
可使用XML编辑器来编辑Schema文件
可使用XML编辑器来解析Schema文件
Schema可保护数据通信:
Schema是可扩展的,因为是XML编写的,
通过可扩展的Schema定义:
在其他Schema中重负使用您的Schema
创建由标准类型衍生而来的您自己的数据类型
在相同文档中引用多重的Schema
Schema例子:
对Schema的使用:
Schema文件的解释:
7、xsl技术是做什么的?
XSL 之于 XML 就像 CSS 之于 HTML。它是指可扩展样式表语言 (EXtensible Stylesheet Language)。这是一种用于以可读格式呈现 XML 数据的语言。
XSL 实际上包含两个部分:
* XSLT – 用于转换 XML 文档的语言
* XPath – 用于在 XML 文档中导航的语言
XSLT 是指 XSL 转换 (XSL Transformation),它是 XSL 最重要的部分。**
XML解析中,请说出DOM和SAX的区别。
解析xml有四种方法:DOM,SAX,DOM4j,JDOM.
我们主要学了两种:DOM和SAX.
DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。
DOM和SAX的不同:
1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。
2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。
3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不行。SAX是从文档开始执行遍历的。并且只能遍历一次。也就是说我们不能随机的访问XML文件,只能从头到尾的将XML文件遍历一次(当然也可以中间截断遍历)。
什么情况下需要使用反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
java的反射机制是框架的基础,比如经典的web开发框架spring,strusts,strusts2等都是建立在反射的基础上的.
Class 类的作用及其主要功能?
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。JVM利用运行时信息选择相应的方法执行。而保存这些信息的类称为Class。可能容易产生混淆,容易想到class。不过二者没什么关系,class不过是描述类的一个关键字。而Class却是保存着运行时信息的类。
它能做什么?Class类可以帮助我们在程序运行时分析类,说白了就是获取类中的值。可能瞬间就想到了反射,没错!Class一般就是和反射配套使用的,因为我们向Class提供一个类或一个类的类名,Class就可以提供我们很多信息,比如属性/方法/修饰符/构造器/类名等等。然后我们就可以进一步进行反射。
如何使用反射创建一个对象?
Class clazz=Class.forName(“test.User”);
Object obj=clazz.newInstance();
这是用反射创建对象的方法之一,也是最常用的
如何使用反射操作属性?
对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
如何使用反射执行方法?
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
反射的优缺点有哪些?
正则表达式是用来做什么的?用自己的话描述。
正则表达式是用来操作字符串的,即用一些特定的符号来表示一些代码操作,从而简化对字符串的复杂操作。换句话说,用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。
说出下面规则的含义:
\d,\w,\s,.,[1234],[^a-f],{},?,+,*,\b
\d : 数字:[0-9];
\w: 单词字符:[a-zA-Z_0-9];
\s: 空白字符:[ \t\n\x0B\f\r];空格、水平制表符、换行、垂直制表符、换页、回车等。
.:任何字符。
[1234]:字符串长度为1,值为1、2、3、4中的一个数字;
[^a-f] :字符串长度为1,值为除了a-f的其它字符;
{}:匹配长度,如 \s{3} 表示匹配三个空白字符;
?:它前面相邻的字符重复0或1次;
+:它前面相邻的字符重复1到多次;
*:它前面相邻的字符重复0到多次;
\b:单词边界。匹配的是一个位置而不是字符,这个位置的一侧是构成单词的字符,另一侧是非单词字符、字符串的开始或结束位置。
分别说出在单行模式和多行模式下,他们的含义:
^ab, ab$;
先介绍一下多行模式和单行模式的概念:
多行模式:
^ 可以匹配字符串开头(字符串的开始位置),也可以匹配行的开头(即换行符\n之后的位置)
$ 可以匹配字符串结尾(字符串的结束位置), 也可以匹配行的结尾(即换行符\n之前的位置)
单行模式:
^ 只能匹配字符串开头
KaTeX parse error: Can't use function '\r' in math mode at position 23: …串结尾 注意这里有一个知识点:\̲r̲为回车符,\n 为换行符。在w…为例:
String str=“ab\nab\nab\n”;
String reg="^ab";//默认是单行模式;
//String reg=”(?m)^ab”; 这个是多行模式,需要加(?m),m是”multiLine”的缩写。
Pattern p=Pattern.compile(reg);
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+""+m.end());
}
单行模式时:无输出,也就是没有匹配的字符串。因为单行模式时从头到尾地匹配,字符串"ab\nab\nab\n"和正则表达式"^ab"是不匹配的。
多行模式时:
ab
0 2
ab
3 5
ab
6 8
因为多行模式是从字符串开始匹配到换行符(\n)之前,接下来从\n之后重新匹配再到下一个\n之前(或字符串结束)。字符串"ab\nab\nab\n"中有3个”\n”,每两个”\n”之间的字符都与正则表达式"^ab"匹配,所以输出以上结果。
单行,多行模式,都是正则表达式的模式修饰符里面出现的参数。
单行跟多行是冲突的,一次只能指定一个选项,不能同时使用
贪婪模式和非贪婪模式的区别是? 并说出如何使用贪婪模式、如何使用非贪婪模式。
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str=“abcaxc”;
Patter p="abc";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(abc)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。
2.编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
?:0或一个
\D,\d分别表示什么意思?
\d:数字[0-9];
\D:非数字[^0-9];
说明反向引用是什么意思?
(1)捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。要了解反向引用,首先要了解捕获组,关于捕获组,请参考相关资料。
(2)捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。
(3)反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。
(4)示例说明:
源字符串:abcdebbcde
正则表达式:([ab])\1,这里的”\1”就是反向引用。
对于正则表达式“([ab])\1”,捕获组中的子表达式“[ab]”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。
说明预搜索的含义?用自己的语言描述。
预搜索是用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ < > 这样的锚定作用,仅仅用于指定一个位置,不参与内容匹配。
还是来用例子说话吧:
(1)正则表达式:(?<=src=").?(?="), “表示转义,即双引号”
其中(?<=)为反向预搜索,表示要匹配的字符串前面必须是src="
(?=)为正向预搜索,表示要匹配的字符串后面必须是"
.?表示要匹配的内容
(2)用上例来匹配以下文本:
待测试的文本:
那么执行这个正则表达式后,就可以提取出/UploadFiles/image/20140304/20140304094318_2971.png
(3)预搜索的语法:
(?=xxx)
正向预搜索(向右)
正向预搜索,判断当前位置右侧是否能匹配指定表达式
(?!xxx)
正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式
(?<=xxx)
反向预搜索(向左)
反向预搜索,判断当前位置左侧是否能够匹配指定表达式
(?<!xxx)
反向预搜索否定,判断当前位置左侧是否不能够匹配指定表达式
预搜索分两种,一种是向右,另外一种是向左。
【上机】完成电子邮件的表达式
根据对电子邮箱格式要求的不同所得的正则表达式也是不同的。下例写得有点复杂,仅做参考:
/^ a-z@([a-z0-9][-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i
解释:
①
/内容/i: 构成一个不区分大小写的正则表达式;^ 匹配开始;$ 匹配结束。
②[a-z]: E-Mail前缀必需是一个英文字母开头
③([a-z0-9][-_]?[a-z0-9]+) :和_a_2、aaa11、1_a_2匹配,和a1、aaff_33a_、a__aa不匹配,如果是空字符,也是匹配的,*表示0个或者多个。
④*表示0个或多个前面的字符.
⑤[a-z0-9]* :匹配0个或多个英文字母或者数字;[-_]? 匹配0个或1“-”,因为“-”不能连续出现。
⑥[a-z0-9]+: 匹配1个或多个英文字母或者数字,因为“-”不能做为结尾
⑦@: 必需有个有@
⑧([a-z0-9][-_]?[a-z0-9]+)+ :见上面([a-z0-9][-_]?[a-z0-9]+)*解释,但是不能为空,+表示一个或者为多个。
⑨[.]: 将特殊字符(.)当成普通字符;[a-z]{2,3} 匹配2个至3个英文字母,一般为com或者net等。
⑩([.][a-z]{2})? :匹配0个或者1个[.][a-z]{2}(比如.cn等) 我不确定一般.com.cn最后部份是不是都是两位的,如果不是请修改{2}为{起始字数,结束字数} 。
【上机】完成电话号码和手机号码的表达式
验证手机号码:13XXXX,15XXXX,18XXX开头的手机号码:
String tel=“13900098900”;
String telReg=“1[358]\d{9}”;
System.out.println(tel.matches(telReg));
group(),group(1),group(2)的区别。
group(int index)的参数和所匹配正则表达式的分组有关。Index就是正则表达式中组的编号(第几组)。group()和group(0)都是指的整个串,group(1) 指的是第一组的内容,group(2)指的第二组的内容。
代码示例:
String str = “Hello,World! in Java.”;
Pattern pattern = Pattern.compile(“W(or)(ld!)”);//对正则表达式进行分组
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println(“Group 0:”+matcher.group(0));//得到第0组——整个匹配
System.out.println(“Group 1:”+matcher.group(1));//得到第一组匹配——与(or)匹配的
System.out.println(“Group 2:”+matcher.group(2));//得到第二组匹配——与(ld!)匹配的,组也就是子表达式
}
结果:
Group 0:World!
Group 1:or
Group 2:ld!