XML.docx
《XML.docx》由会员分享,可在线阅读,更多相关《XML.docx(28页珍藏版)》请在冰豆网上搜索。
![XML.docx](https://file1.bdocx.com/fileroot1/2023-1/6/84b3fbc5-80bb-4749-8950-691f87108e1d/84b3fbc5-80bb-4749-8950-691f87108e1d1.gif)
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文档解析器对象
varxmldoc=newActiveXObject("Microsoft.XMLDOM");
//开启xml校验
xmldoc.validateOnParse="true";
//装载xml文档
xmldoc.load("_2books.xml");
//获取错误信息
vara=xmldoc.parseError.reason;
varb=xmldoc.parseError.line;
document.write("errorreasonis-----"+a+"
"+"errrolineis-----"+b);
如果内部引用:
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>