XML.docx

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

XML.docx

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

XML.docx

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

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

当前位置:首页 > 高中教育 > 高中教育

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

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