XML.docx
- 文档编号:4543417
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:15
- 大小:128.74KB
XML.docx
《XML.docx》由会员分享,可在线阅读,更多相关《XML.docx(15页珍藏版)》请在冰豆网上搜索。
XML
学习XML的目的:
●根据DTD或Schema文件根据需求写出相应的XML文档
●解析XML(JDOM,DOM4J)
●用程序动态生成简单的XML文档
XML
ExtensibleMarkupLanguage可扩展标记语言
XML 家族谱
XML语法:
XML命名规则:
*名称可以含字母、数字以及其他字符,但是避免使用".",":
"字符
*名称不能以数字或者标点符号开始
*名称不能以字符"xml"(或者"XML"、"Xml")开始
*名称不能包含空格
验证一个XML文档是否正确
●格式正确
⏹编程验证
⏹XMLParser(eg.IE,FireFox)
⏹XMLEditor(eg.Eclipse,XMLSpy)
●与DTD/Schema文档相符
⏹编程检查
⏹XMLParser
⏹XMLEditor
编程验证XML文档是否正确
在IE5以上的浏览器中内置了一个XML的解析工具:
Microsoft.XMLDOM,咱们可以通过编写很简单的JavaScrip代码就可以进行编程验证了,步骤如下:
●创建XML文档解析器对象
varxmldoc=newActiveXObject("Microsoft.XMLDOM");
●在解析器解析XML文档的时候开启验证
xmldoc.validateOnParse="true";
●装载XML文档
xmldoc.load("students.xml");
●获取XML错误信息并且打印出来
document.write("错误信息:
"+xmldoc.parseError.reason+"
");
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[
ELEMENTstudents(student+)>
ELEMENTstudent(name,age,sex)>
ELEMENTname(#PCDATA)>
ELEMENTage(#PCDATA)>
ELEMENTsex(#PCDATA)>
]>
●外部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
多个属性值要用空格隔开
例如:
●ENUMERATED枚举
●ENTITY/ENTITYS实体
实体就是用于为一段内容创建的一个别名,相当于编程语言里面的常量,但是比常量的功能要强一些,目的在于便于重用
●其他不常用的类型参见W3scholl.chm手册,自己下去测试
AttributeDescription
●#REQUIRED必须有
●#IMPLIED可以有
●#FIXEDvalue如果有,值必须是value
●defaultvalue如果不指定属性值,给定默认值,默认值:
value
ENTITY/ENTITYS实体
●引用实体
主要用在XML文档中(例如内置实体的调用:
><)
⏹语法格式(DTD中定义)
ENTITYcopyright“Copyright(C)V.Zhang”>
⏹引用方式(在XML中调用)
©right;
●参数实体
主要被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实例
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
⏹通过Factory获取DocumentBuilder解析器对象实例
DocumentBuilderdb=dbf.newDocumentBuilder();
⏹创建一个新的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("select");
ElementchildElt2_name=newElement("name");
childElt2_name.setText("贵州省");
childElt2_name.setAttribute("id","2");
childElt2.addContent(childElt2_name);
rootElt.addContent(childElt2);
doc.addContent(rootElt);
//Documentdocument=newDocument(rootElt);
●创建XMLOutputter实例
XMLOutputterouter=newXMLOutputter();
⏹这里还可以指定格式和设置编码
Formatformat=Format.getPrettyFormat();
format.setEncoding("GB2312");
XMLOutputterouter=newXMLOutputter();
outer.setFormat(format);
●通过输出流和XMLOutputter的output方法把Document写入文件
outer.output(doc,newFileOutputStream("TestJDomWriteXML.xml"));
DOM4J步骤
这里就可以通过看我的例子
作业:
●通过DOM4J把今天的读写XML的例子重新写一遍
●完成课本后面的所有习题
●自学XPath,通过例子和手册学习(XPathTutorial.chm)
课后作业第4题(Page:
37)
test4.xml
xmlversion="1.0"encoding="UTF-8"?
>
<成绩单>
<张三>
<数学>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 Nodenode=eltList.item(i); if(node.getNodeType()==Node.ELEMENT_NODE){ count++; NodeListnodeList=node.getChildNodes(); for(intii=0;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); } if(name.equals("物理")){ sum_phy+=Integer.parseInt(value); } } } } } System.out.println("总人数: "+count+",数学平均成绩: "+sum_math/count+",物理平均成绩: "+sum_phy/count); }catch(ParserConfigurationExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SAXExceptione){ //TODOAuto-g
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XML