XML.docx

上传人:b****6 文档编号:6460625 上传时间:2023-01-06 格式:DOCX 页数:28 大小:478.04KB
下载 相关 举报
XML.docx_第1页
第1页 / 共28页
XML.docx_第2页
第2页 / 共28页
XML.docx_第3页
第3页 / 共28页
XML.docx_第4页
第4页 / 共28页
XML.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

XML.docx

《XML.docx》由会员分享,可在线阅读,更多相关《XML.docx(28页珍藏版)》请在冰豆网上搜索。

XML.docx

XML

XML笔记

可扩展标记语言(ExtensibleMarkupLanguage),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

它的设计宗旨是传输数据,而不是显示数据。

它的标签没有被预定义需要自行定义标签。

Xml和html的区别:

HTML中的标记是用来显示数据的,而XML中的标记用来描述数据的性质和结构。

HTML是不区分大小写的,而XML是严格区分大小写的。

HTML可以有多个根元素,而XML有且只能有一个根元素。

HTML中,属性值的引号是可用可不用的,而XML中,属性值必须放在引号中。

HTML中,空格是可用自动过滤的,而XML中,空格等部分则不会自动删除。

HTML中的标记是预定义的,而XML中的标记是可以随便定义的,并且可扩展。

.语法特点

1.标签用户自己定义

2.一个标签分为起始和结束标签,不能省略结束标签

3.标签中可以嵌套若干子标签,不允许交叉嵌套

4.必须有且仅有一个根标签

5.XML中不会忽略主体内容中出现的空格和换行\t

6.包含字母、数字、减号、下划线和英文句点

7.严格区分大小写

8.通过

[CDATA[文本或标签]]>,它的作用是将文本或标签转为文本结点

注释:

xml注释为

---->但是不能注释里面在加小注释。

为什么乱码?

encoding属性说明文档所使用的字符编码,默认为UTF-8。

保存在磁盘上的文件编码要与声明的编码一致。

xmlversion="1.0"?

>

王召

22

钓鱼

[CDATA[这是一个秘密]]>

常用的约束技术:

XMLDTD、XMLSchema、XDR、SOX。

DTD

文档类型定义(DocumentTypeDefinition)是一套关于标记符的语法规则。

它是标准通用标记语言和[1]  可扩展标记语言1.0版规格的一部分,是文档的验证机制。

文档类型定义是一种保证标准通用标记语言、可扩展标记语言文档格式正确的有效方法,可通过比较文档和文档类型定义文件来看文档是否符合规范,元素和标签使用是否正确。

约束xml书写的规范。

假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:

DOCTYPE根元素SYSTEM"文件名">

一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:

属性值一定要用引号(单引号或双引号)引起来。

属性名称的命名规范与元素的命名规范相同

元素中的属性是不允许重复的

语法:

ELEMENT元素名称使用规则>

使用规则:

(#PCDATA):

指示元素的主体内容只能是普通的文本.(ParsedCharacterData)

EMPTY:

用于指示元素的主体为空。

比如

ANY:

用于指示元素的主体内容为任意类型。

(子元素):

指示元素中包含的子元素

定义子元素及描述它们的关系:

如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。

如:

ELEMENTFILE(TITLE,AUTHOR,EMAIL)

如果子元素用“|”分开,说明任选其一。

如:

ELEMENTFILE(TITLE|AUTHOR|EMAIL)

用+、*、?

来表示元素出现的次数

如果元素后面没有+*?

:

表示必须且只能出现一次

+:

表示至少出现一次,一次或多次

*:

表示可有可无,零次或多次

?

:

表示零次或一次。

如:

ELEMENTMYFILE((TITLE*,AUTHOR?

EMAIL)*|COMMENT)>

IE5以上浏览器内置了XML解析工具:

Microsoft.XMLDOM,开发人员可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证。

创建xml文档解析器对象

varxmldoc=newActiveXObject("Microsoft.XMLDOM");

开启xml校验

xmldoc.validateOnParse="true";

装载xml文档

xmldoc.load("book.xml");

获取错误信息

xmldoc.parseError.reason;

xmldoc.parseError.line;

内部应用DTD

案例:

html文件(进行验证xml是否和dtd匹配)从结果看360浏览器不支持。

DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:

//www.w3.org/TR/html4/loose.dtd">

再加一个html解析dtd

如果内部引用:

Xml文件

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPE书架SYSTEM"_2books.dtd">

<书架>

<书>

<书名>水浒传

<作者>施耐庵

<售价内部价="60">

<书>

<书名>三国演义

<作者>&wuchengen;

<售价内部价="70">

<书>

<书名>西游记

<作者>

<售价内部价="80">

<书>

<书名>红楼梦

<作者>曹雪芹

<售价内部价="90">

Dtd文件

xmlversion="1.0"encoding="UTF-8"?

>

ELEMENT书架(书+)>

ELEMENT书(书名,作者,售价)>

ELEMENT书名(#PCDATA)>

ELEMENT作者(#PCDATA)>

ELEMENT售价(#PCDATA)>

ATTLIST售价

内部价CDATA#REQUIRED

批发价(200|2000|20000)"2000"

>

ENTITYwuchengen"吴承恩">

运行xml

如果改动wuchengen为wucheng(即上面dtd定义实体的代码)则报错如下:

如何根据DTD中定义的内容来验证XML书写是否正确呢?

答:

需要软件程序,即解析器

根据能否对XML文档进行约束模式校验,可以将解析器分为两类:

非校验解析器,如IE

校验解析器

XML解析方式分为两种:

DOM方式和SAX方式

DOM:

DocumentObjectModel,文档对象模型。

这种方式是W3C推荐的处理XML的一种方式。

SAX:

SimpleAPIforXML。

这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。

XML解析开发包

JAXP:

是SUN公司推出的解析标准实现。

Dom4J:

是开源组织推出的解析开发包。

(牛,大家都在用,包括SUN公司的一些技术的实现都在用)

JDom:

是开源组织推出的解析开发包。

JAXP:

(JavaAPIforXMLProcessing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:

org.w3c.dom:

提供DOM方式解析XML的标准接口

org.xml.sax:

提供SAX方式解析XML的标准接口

javax.xml:

提供了解析XML文档的类

javax.xml.parsers包中,定义了几个工厂类。

我们可以通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象。

DocumentBuilderFactory

SAXParserFactory

调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。

调用工厂对象的newDocumentBuilder方法得到DOM解析器对象。

调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象,进行可以利用DOM特性对整个XML文档进行操作了。

关于自己写成一个java工具util可以调用(见视频)。

DOM解析:

要生成节点树木必须加载整个文档,容易造成内存溢出。

SAX解析:

读取单个节点,再去触发事件,占用内存小,适合读取xml,但是不适合做修改。

xmlversion="1.0"encoding="UTF-8"?

>

<书架>

<书>

<书名>水浒传

<作者>施耐庵

<售价内部价="60">

<书>

<书名>三国演义

<作者>忘了

<售价内部价="70">

<书>

<书名>西游记

<作者>

<售价内部价="80">

<书>

<书名>红楼梦

<作者>曹雪芹

<售价内部价="90">

案例:

(dom解析)

packagewangdom.test;

importjavax.xml.parsers.DocumentBuilder;

importjavax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

importorg.w3c.dom.Document;

importorg.w3c.dom.Node;

importorg.w3c.dom.NodeList;

publicclassDomtest{

publicstaticvoidmain(String[]args)throwsException{

DocumentBuilderFactorydbfactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=dbfactory.newDocumentBuilder();

Documentdocument=builder.parse("src/books.xml");

//找节点

NodeListlist=document.getElementsByTagName("作者");

NodeauthorNode=list.item(0);

//找文本输出

System.out.println(authorNode.getTextContent());

}

}

案例:

(sax解析)

packagesaxmethod;

importjavax.xml.parsers.SAXParser;

importjavax.xml.parsers.SAXParserFactory;

importorg.xml.sax.Attributes;

importorg.xml.sax.SAXException;

importorg.xml.sax.helpers.DefaultHandler;

publicclassSaxtest{

publicstaticvoidmain(String[]args)throwsException{

//得到SAXParserFactory实例:

SAXParserFactoryfactory=SAXParserFactory.newInstance();

//共厂创建解析器SAXParser

SAXParserparser=factory.newSAXParser();

//下面new的是内部匿名类

parser.parse("src/books.xml",newDefaultHandler(){

publicvoidstartDocument()throwsSAXException{

System.out.println("文档开始了哈");

}

publicvoidendDocument()throwsSAXException{

System.out.println("文档结束了哈");

}

publicvoidstartElement(Stringuri,StringlocalName,StringqName,

Attributesattributes)throwsSAXException{

System.out.println("元素开始了哈");

}

publicvoidendElement(Stringuri,StringlocalName,StringqName)

throwsSAXException{

System.out.println("元素结束了哈");

}

publicvoidcharacters(char[]ch,intstart,intlength)

throwsSAXException{

System.out.println(newString(ch,start,length));

}

});

}

}

………………………………………………………………………………

案例:

Book.java//此文档中的文档开始和文档结束没用到可以删掉。

packagewangdom.test;//添加有参无参方法

publicclassBook{

privateStringbookname;

privateStringauthor;

privatedoubleprice;

publicStringtoString(){

return"Book[bookname="+bookname+",author="+author+",price="

+price+"]";

}

publicBook(Stringbookname,Stringauthor,doubleprice){

super();

this.bookname=bookname;

this.author=author;

this.price=price;

}

publicBook(){

super();

}

publicStringgetBookname(){

returnbookname;

}

publicvoidsetBookname(Stringbookname){

this.bookname=bookname;

}

publicStringgetAuthor(){

returnauthor;

}

publicvoidsetAuthor(Stringauthor){

this.author=author;

}

publicdoublegetPrice(){

returnprice;

}

publicvoidsetPrice(doubleprice){

this.price=price;

}

}

Saxtest2.java

packagewangdom.test;

importjava.util.ArrayList;

importjava.util.List;

importjavax.xml.parsers.SAXParser;

importjavax.xml.parsers.SAXParserFactory;

importorg.xml.sax.Attributes;

importorg.xml.sax.SAXException;

importorg.xml.sax.XMLReader;

importorg.xml.sax.helpers.DefaultHandler;

publicclassSaxtest2{

publicstaticvoidmain(String[]args)throwsException{

SAXParserparser=SAXParserFactory.newInstance().newSAXParser();

//得到xmlreader对象

XMLReaderreader=parser.getXMLReader();

finalListbooks=newArrayList();

//设置内容处理器

reader.setContentHandler(newDefaultHandler(){

Bookbook=null;

Stringnode=null;

publicvoidstartDocument()throwsSAXException{

}

publicvoidendDocument()throwsSAXException{

}

publicvoidstartElement(Stringuri,StringlocalName,

StringqName,Attributesattributes)throwsSAXException{

if("书".equals(qName)){

book=newBook();

}

node=qName;

}

publicvoidendElement(Stringuri,StringlocalName,StringqName)

throwsSAXException{

if("书".equals(qName)){

books.add(book);

book=null;

}

node=null;

}

publicvoidcharacters(char[]ch,intstart,intlength)

throwsSAXException{

if("书名".equals(node))

book.setBookname(newString(ch,start,length));

if("作者".equals(node))

book.setAuthor(newString(ch,start,length));

if("售价".equals(node))

book.setPrice(Double.parseDouble(newString(ch,start,length)));

}

});

//加载

reader.parse("src/books.xml");

//遍历

for(Bookb:

books){

System.out.println(b);

}

}

}//下面出现70是因为上述xml文件改动了,加了一个70element。

案例:

packageunittest;

importorg.junit.Assert;

importorg.junit.Test;

publicclassJtest{

classMymath{

publicintadd(intx,inty){

returnx+y;

}

publicintmult(inta,intb){

returna*b;

}

}

Mymathmymath=newMymath();

@Test(timeout=1)//【判断是否超时单位是毫秒

//一定是无参无返回测试时点上方法也就是test1,然后raunas1junittest(实验证明不选上也可以的)

publicvoidtest1(){

intresult=mymath.add(10,20);

//可以加上一句断言(判断和结果是不是相等,可有可不有)

Assert.assertEquals(30,result);

}

//@Test是注解,当然还有beforeafter等。

@Test

publicvoidtest2(){

intresult=mymath.mult(10,20);

//可以加上一句断言(判断和结果是不是相等,可有可不有)

Assert.assertEquals(200,result);

}

}

案例:

NewXMLSchema.xsd文件

xmlversion="1.0"encoding="UTF-8"?

>

schemaxmlns:

xs="http:

//www.w3.org/2001/XMLSchema"

targetNamespace="http:

//www."

elementFormDefault="qualified">

elementname='书架'>

complexType>

sequencemaxOccurs='unbounded'>

elementname='书'>

complexType>

sequence>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1