XMLWord文档下载推荐.docx
《XMLWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《XMLWord文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
gender>
男<
/gender>
age>
22<
/age>
hobby>
钓鱼<
/hobby>
[CDATA[<
weight>
这是一个秘密<
/weight>
]]>
/student>
/astudent>
常用的约束技术:
XMLDTD、XMLSchema、XDR、SOX。
DTD
文档类型定义(DocumentTypeDefinition)是一套关于标记符的语法规则。
它是标准通用标记语言和[1]
可扩展标记语言1.0版规格的一部分,是文档的验证机制。
文档类型定义是一种保证标准通用标记语言、可扩展标记语言文档格式正确的有效方法,可通过比较文档和文档类型定义文件来看文档是否符合规范,元素和标签使用是否正确。
约束xml书写的规范。
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:
DOCTYPE根元素SYSTEM"
文件名"
一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:
mytagname=“value”…/>
属性值一定要用引号(单引号或双引号)引起来。
属性名称的命名规范与元素的命名规范相同
元素中的属性是不允许重复的
语法:
ELEMENT元素名称使用规则>
使用规则:
(#PCDATA):
指示元素的主体内容只能是普通的文本.(ParsedCharacterData)
EMPTY:
用于指示元素的主体为空。
比如<
br/>
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>
head>
title>
再加一个html解析dtd<
/title>
script>
//创建xml文档解析器对象
varxmldoc=newActiveXObject("
//开启xml校验
xmldoc.validateOnParse="
//装载xml文档
xmldoc.load("
_2books.xml"
//获取错误信息
vara=xmldoc.parseError.reason;
varb=xmldoc.parseError.line;
document.write("
errorreasonis-----"
+a+"
"
+"
errrolineis-----"
+b);
/script>
/head>
body>
/body>
/html>
如果内部引用:
Xml文件
encoding="
UTF-8"
?
DOCTYPE书架SYSTEM"
_2books.dtd"
>
书架>
书>
<
书名>
水浒传<
/书名>
作者>
施耐庵<
/作者>
售价内部价="
60"
/售价>
/书>
三国演义<
&
wuchengen;
70"
西游记<
80"
红楼梦<
曹雪芹<
90"
/书架>
Dtd文件
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,但是不适合做修改。
忘了<
(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{
//得到SAXParserFactory实例:
SAXParserFactoryfactory=SAXParserFactory.newInstance();
//共厂创建解析器SAXParser
SAXParserparser=factory.newSAXParser();
//下面new的是内部匿名类
parser.parse("
newDefaultHandler(){
publicvoidstartDocument()throwsSAXException{
System.out.println("
文档开始了哈"
publicvoidendDocument()throwsSAXException{
System.out.println("
文档结束了哈"
publicvoidstartElement(Stringuri,StringlocalName,StringqName,
Attributesattributes)throwsSAXException{
元素开始了哈"
publicvoidendElement(Stringuri,StringlocalName,StringqName)
throwsSAXException{
元素结束了哈"
publicvoidcharacters(char[]ch,intstart,intlength)
System.out.println(newString(ch,start,length));
}
});
………………………………………………………………………………
Book.java//此文档中的文档开始和文档结束没用到可以删掉。
//添加有参无参方法
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(){
publicStringgetBookname(){
returnbookname;
publicvoidsetBookname(Stringbookname){
publicStringgetAuthor(){
returnauthor;
publicvoidsetAuthor(Stringauthor){
publicdoublegetPrice(){
returnprice;
publicvoidsetPrice(doubleprice){
Saxtest2.java
importjava.util.ArrayList;
importjava.util.List;
importorg.xml.sax.XMLReader;
publicclassSaxtest2{
SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
//得到xmlreader对象
XMLReaderreader=parser.getXMLReader();
finalList<
Book>
books=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{
books.add(book);
book=null;
node=null;
publicvoidcharacters(char[]ch,intstart,intlength)
书名"
.equals(node))
book.setBookname(newString(ch,start,length));
book.setAuthor(newString(ch,start,length));
售价"
book.setPrice(Double.parseDouble(newString(ch,start,length)));
}
});
//加载
reader.parse("
//遍历
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文件
xs:
schemaxmlns:
xs="
//www.w3.org/2001/XMLSchema"
targetNamespace="
//www."
elementFormDefault="
qualified"
elementname='
书架'
complexType>
<
sequencemaxOccurs='
unbounded'
<
书'
<
<
sequence>
x