XMLWord下载.docx
- 文档编号:17478364
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:15
- 大小:128.74KB
XMLWord下载.docx
《XMLWord下载.docx》由会员分享,可在线阅读,更多相关《XMLWord下载.docx(15页珍藏版)》请在冰豆网上搜索。
);
●在解析器解析XML文档的时候开启验证
xmldoc.validateOnParse="
true"
;
●装载XML文档
xmldoc.load("
students.xml"
●获取XML错误信息并且打印出来
document.write("
错误信息:
+xmldoc.parseError.reason+"
<
br/>
document.write("
错误行号:
+xmldoc.parseError.line+"
DTD(DocumentTypeDefinition,文档类型定义)
作用:
用来定义(约束)XML文档的合法构建模块,它使用一系列的合法元素来定义文档结构。
(Schema)
DTD语法
?
xmlversion="
1.0"
encoding="
UTF-8"
>
!
ELEMENTstudents(student+)>
<
ELEMENTstudent(name,age,sex)>
<
ELEMENTname(#PCDATA)>
ELEMENTage(#PCDATA)>
ELEMENTsex(#PCDATA)>
+表示至少有一个
必须按照定义的顺序来写XML
*零个或多个
最多一个(零个或一个)
()作为一个组合
|在列出的集合元素中,只要选择一个就可以
在XML中引入DTD文件
例如在HTML文件
DOCTYPEhtmlpublic“http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
DOCTYPEstudnetsSYSTEM“students.dtd”>
DTD文档声明和引用
●内部DTD文档
DOCTYPEstudents[
ELEMENTstudent(name,age,sex)>
]>
●外部DTD文档
DOCTYPEstudentsSYSTEM“students.dtd”>
●内外部DTD文档混合引用
DOCTYPEstudentsSYSTEM“students.dtd”[
EMLEMT…>
…
SYSTEM表示本地DTD文档
PUBLIC公共的DTD文档,跟URL地址
DTDELEMENT语法(元素语法)
●EMPTY空元素,不能包含子元素,但是可以有属性
●ANY可以包含任何字符数据,如果要有子元素,只能用DTD里面定义过的元素
●#PCDATA可以包含任何字符数据,但是不能包含任何子元素
●其他类型,比如集合,例如<
ELEMENTparent(#PCDATA|name|sex|age)*>
DTDATTLIST语法(属性语法)
ATTLISTelement_name
attr_nametype_nameattr_desc
attr_nametype_nameattr_desc
AttributeType:
●CDATA可以放文本
●ID表示属性的值不能重复,同时不要以数字开头
●IDREF/IDREFS(IDreferences)表示该属性的值需要去参照另外一个类型为ID的属性值(相当于数据库里的外键关联),关联一个用IDREF,如果要关联多个则用IDREFS
多个属性值要用空格隔开
例如:
studentid="
stu003"
team="
stu001stu002"
●ENUMERATED枚举
●ENTITY/ENTITYS实体
实体就是用于为一段内容创建的一个别名,相当于编程语言里面的常量,但是比常量的功能要强一些,目的在于便于重用
●其他不常用的类型参见W3scholl.chm手册,自己下去测试
AttributeDescription
●#REQUIRED必须有
●#IMPLIED可以有
●#FIXEDvalue如果有,值必须是value
●defaultvalue如果不指定属性值,给定默认值,默认值:
value
ENTITY/ENTITYS实体
●引用实体
主要用在XML文档中(例如内置实体的调用:
&
gt;
lt;
)
⏹语法格式(DTD中定义)
ENTITYcopyright“Copyright(C)V.Zhang”>
⏹引用方式(在XML中调用)
&
copyright;
●参数实体
主要被DTD文件自己使用
⏹语法格式
ENTITY%entity_name“content”>
⏹引用方式
%entity_name;
参数实体举例:
例一:
ENTITY%TAG_NAMES“姓名|EMAIL|电话|地址”>
ELEMENT个人信息(%TAG_NAMES;
|生日)>
ELEMENT客户信息(%TAG_NAMES;
|公司名)>
例二:
ENTITY%common.attributes
“idID#IMPLIED
accountCDATA#REQUIRED”
…
ATTLISTpurchaseOrder%common.attributes;
ATTLISTitem%common.attributes;
ATTLISTitem
idID#IMPLIED
accountCDATA#REQUIRED
DTD的实际操作
学习DTD的目标:
一般公司很少让程序员自己写DTD,要求程序员看得懂DTD,同时可以根据给定的DTD写出对应的XML
作业:
●根据W3school.chm手册DTD实例产品目录DTD写一个正确规范的XML文档
●根据手册自学Schema,尝试使用Schema把上述产品目录DTD改成Schema
DOM(DocumentObjectModel)
XML解析
●解析方式
⏹DOM解析
直接性把XML文档全部读取到内存中来,会得到一个Doucument对象,然后对其访问操作,DOM方式W3C推荐的一种方式.
⏹SAX解析
SimpleAPIforXML,不是官方的标准,但他是XML领域事实上的标准
SAX是边读取XML文档,边解析
●XML的解析器
⏹Crimson(SUN)
⏹Xerces(IBM->
Apache)
⏹Aelfred(JDOM,DOM4J)
第三方的解析工具JDOM,DOM4J
JavaAPI里面对XML的解析工具JAXP(JavaApiForXmlProcessing)
涉及包:
javax.xml,org.w3c.dom,org.xml.sax
JAXP方式解析XML步骤(DOM方式)
●获取DocumentBuilderFactory实例
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
●通过Factory获取DocumentBuilder解析器对象实例
DocumentBuilderdb=dbf.newDocumentBuilder();
●加载要解析的XML文档,获取Document对象
Documentdoc=db.parse(newFileInputStream("
xmlfile/students.xml"
));
●对Document对象进行操作
动态生成XML文档,并写入文件
●创建Document实例
⏹获取DocumentBuilderFactory实例
⏹通过Factory获取DocumentBuilder解析器对象实例
⏹创建一个新的Document对象
Documentdoc=db.newDocument();
⏹添加一系列的元素
ElementrootElt=doc.createElement("
班级"
ElementstudentElt1=doc.createElement("
学生"
ElementstudentElt1_name=doc.createElement("
姓名"
studentElt1_name.setTextContent("
张曼玉"
studentElt1_name.setAttribute("
别名"
玉姐"
ElementstudentElt1_sex=doc.createElement("
性别"
studentElt1_sex.setTextContent("
女"
studentElt1.appendChild(studentElt1_name);
studentElt1.appendChild(studentElt1_sex);
ElementstudentElt2=doc.createElement("
ElementstudentElt2_name=doc.createElement("
studentElt2_name.setTextContent("
林青霞"
studentElt2_name.setAttribute("
霞妹"
ElementstudentElt2_sex=doc.createElement("
studentElt2_sex.setTextContent("
studentElt2.appendChild(studentElt2_name);
studentElt2.appendChild(studentElt2_sex);
rootElt.appendChild(studentElt1);
rootElt.appendChild(studentElt2);
doc.appendChild(rootElt);
●获取TransfomerFactory实例
TransformerFactorytff=TransformerFactory.newInstance();
●通过TransfomerFactory创建Transformer实例
Transformertf=tff.newTransformer();
●通过Document生成DOMSource实例
DOMSourcesourse=newDOMSource(doc);
●创建写DOM文档的输出流
StreamResultxmlResult=newStreamResult(newFileOutputStream("
test.xml"
●通过Transfomer的transform方法把DOMSource对象写入输出流
tf.transform(sourse,xmlResult);
JAXP方式解析XML步骤(SAX方式)
SAX解析XML步骤
1)SAXPerserFactoryspf=SAXPerserFactory.newInstance();
2)SAXParsersp=spf.newSAXParser();
3)sp.parse(“test.xml”,newMyHandler());
SAX主要用于对XML文档解析,不能去修改,删除,添加元素
SAX是推行机制,把发现的内容告诉程序员(函数),程序员可以自己决定如何处理
DefaultHandlerSAX事件
●startDoucment()
发现文档的开始,解析器开始扫描文档
●endDocument()
发现了文档尾()
●startElement()
发现了一个起始标签,返回元素名,以及所有属性名和值
●character()
发现了一些文本,将得到一个字符数组,该数字符数组的偏移量和长度变量,有这三个变量可以得到解析器发现的文本
●endElement()
发现一个结束标签,并返回元素名称
DOM模型(DocumentObjectModel)
Parent,Children,Sibling
descendant,ancestor
JDOM解析XML文档(第三方,非JavaSE官方发布的内容)
JDOMwww.jdom.org
解析步骤:
●创建JDOMXML文档解析器对象SAXBuilder
SAXBuilderbuilder=newSAXBuilder();
●通过输入流或文件对象(File)加载XML文档,并可得到Document对象(org.jdom.Document;
Documentdoc=builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("
gobal-configure.xml"
●通过Document对象获得DOM的根节点
ElementrootElt=doc.getRootElement();
现在咱们就可以通过rootElt对这个DOM进行操作了
生成步骤
●创建Document实例(org.jdom.Document)
Documentdoc=newDocument();
ElementrootElt=newElement("
selects"
ElementchildElt1=newElement("
select"
ElementchildElt1_name=newElement("
name"
childElt1_name.setText("
重庆市"
childElt1_name.setAttribute("
id"
1"
childElt1.addContent(childElt1_name);
rootElt.addContent(childElt1);
ElementchildElt2=newElement("
ElementchildElt2_name=newElement("
childElt2_name.setText("
贵州省"
childElt2_name.setAttribute("
2"
childElt2.addContent(childElt2_name);
rootElt.addContent(childElt2);
doc.addContent(rootElt);
//Documentdocument=newDocument(rootElt);
●创建XMLOutputter实例
XMLOutputterouter=newXMLOutputter();
⏹这里还可以指定格式和设置编码
Formatformat=Format.getPrettyFormat();
format.setEncoding("
GB2312"
outer.setFormat(format);
●通过输出流和XMLOutputter的output方法把Document写入文件
outer.output(doc,newFileOutputStream("
TestJDomWriteXML.xml"
DOM4J步骤
这里就可以通过看我的例子
●通过DOM4J把今天的读写XML的例子重新写一遍
●完成课本后面的所有习题
●自学XPath,通过例子和手册学习(XPathTutorial.chm)
课后作业第4题(Page:
37)
test4.xml
成绩单>
张三>
数学>
89<
/数学>
物理>
78<
/物理>
/张三>
李四>
67<
80<
/李四>
/成绩单>
ReadTest4XML.java
packagenet.vzhang.xml.test;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
publicclassReadTest4XML{
publicstaticvoidmain(String[]args){
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
try{
DocumentBuilderdb=dbf.newDocumentBuilder();
Documentdoc=db.parse(newFileInputStream("
test4.xml"
ElementrootElt=doc.getDocumentElement();
//System.out.println(rootElt);
intcount=0;
doublesum_math=0;
doublesum_phy=0;
NodeListeltList=rootElt.getChildNodes();
for(inti=0;
i<
eltList.getLength();
i++){
Nodenode=eltList.item(i);
if(node.getNodeType()==Node.ELEMENT_NODE){
count++;
NodeListnodeList=node.getChildNodes();
for(intii=0;
ii<
nodeList.getLength();
ii++){
Nodecnode=nodeList.item(ii);
if(cnode.getNodeType()==Node.ELEMENT_NODE){
Stringname=cnode.getNodeName();
Stringvalue=cnode.getTextContent();
if(name.equals("
数学"
)){
sum_math+=Integer.parseInt(value);
}
物理"
sum_phy+=Integer.parseInt(value);
}
}
}
}
System.out.println("
总人数:
+count+"
数学平均成绩:
+sum_math/count+"
物理平均成绩:
+sum_phy/count);
}catch(ParserConfigurationExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(FileNotFoundExceptione){
}catch(SAXExceptione){
//TODOAuto-g
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XML