1、XML学习XML的目的: 根据DTD或Schema文件根据需求写出相应的XML文档 解析XML(JDOM,DOM4J) 用程序动态生成简单的XML文档XMLExtensible Markup Language 可扩展标记语言XML家族谱XML语法:XML命名规则:* 名称可以含字母、数字以及其他字符, 但是避免使用., :字符* 名称不能以数字或者标点符号开始* 名称不能以字符xml(或者XML、Xml)开始* 名称不能包含空格验证一个XML文档是否正确 格式正确 编程验证 XML Parser (eg. IE, FireFox) XML Editor (eg. Eclipse,XMLSpy)
2、 与DTD / Schema 文档相符 编程检查 XML Parser XML Editor编程验证XML文档是否正确在IE5以上的浏览器中内置了一个XML的解析工具: Microsoft.XMLDOM, 咱们可以通过编写很简单的JavaScrip代码就可以进行编程验证了, 步骤如下: 创建XML文档解析器对象var xmldoc = new ActiveXObject(Microsoft.XMLDOM); 在解析器解析XML文档的时候开启验证xmldoc.validateOnParse = true; 装载XML文档xmldoc.load(students.xml); 获取XML错误信息并且
3、打印出来document.write(错误信息: + xmldoc.parseError.reason + ); document.write(错误行号: + xmldoc.parseError.line + ); DTD (Document Type Definition,文档类型定义)作用:用来定义(约束)XML文档的合法构建模块,它使用一系列的合法元素来定义文档结构。(Schema)DTD语法 + 表示至少有一个, 必须按照定义的顺序来写XML* 零个或多个? 最多一个(零个或一个)() 作为一个组合| 在列出的集合元素中,只要选择一个就可以在XML中引入DTD文件例如在HTML文件DT
4、D文档声明和引用 内部DTD文档!DOCTYPE students 外部DTD文档 内外部DTD文档混合引用!DOCTYPE students SYSTEM “students.dtd” SYSTEM 表示本地 DTD文档PUBLIC 公共的DTD文档, 跟 URL地址DTD ELEMENT语法 (元素语法) EMPTY 空元素, 不能包含子元素, 但是可以有属性 ANY 可以包含任何字符数据,如果要有子元素, 只能用DTD里面定义过的元素 #PCDATA 可以包含任何字符数据, 但是不能包含任何子元素 其他类型, 比如集合,例如 DTD ATTLIST 语法 (属性语法)Attribute
5、Type: CDATA 可以放文本 ID 表示属性的值不能重复, 同时不要以数字开头 IDREF / IDREFS (ID references) 表示该属性的值需要去参照另外一个类型为ID的属性值(相当于数据库里的外键关联), 关联一个用IDREF, 如果要关联多个则用IDREFS多个属性值要用空格隔开例如: ENUMERATED 枚举 ENTITY / ENTITYS 实体实体就是用于为一段内容创建的一个别名, 相当于编程语言里面的常量, 但是比常量的功能要强一些, 目的在于便于重用 其他不常用的类型参见W3scholl.chm手册, 自己下去测试Attribute Description
6、 #REQUIRED 必须有 #IMPLIED 可以有 #FIXED value 如果有, 值必须是value default value 如果不指定属性值, 给定默认值, 默认值:valueENTITY / ENTITYS 实体 引用实体主要用在XML文档中(例如内置实体的调用: > <) 语法格式(DTD中定义) 引用方式(在XML中调用)©right; 参数实体主要被DTD文件自己使用 语法格式 引用方式% entity_name; 参数实体举例:例一:例二:DTD的实际操作学习DTD的目标:一般公司很少让程序员自己写DTD, 要求程序员看得懂DTD, 同时可以根据给
7、定的DTD写出对应的XML作业: 根据W3school.chm手册DTD实例产品目录DTD写一个正确规范的XML文档 根据手册自学Schema, 尝试使用Schema把上述产品目录DTD改成SchemaDOM(Document Object Model)XML解析 解析方式 DOM解析直接性把XML文档全部读取到内存中来, 会得到一个Doucument对象, 然后对其访问操作, DOM方式W3C推荐的一种方式. SAX解析Simple API for XML, 不是官方的标准, 但他是XML领域事实上的标准SAX是边读取XML文档, 边解析 XML的解析器 Crimson(SUN) Xerce
8、s(IBM-Apache) Aelfred(JDOM, DOM4J)第三方的解析工具JDOM, DOM4JJavaAPI里面对XML的解析工具JAXP(Java Api For Xml Processing)涉及包: javax.xml, org.w3c.dom, org.xml.saxJAXP方式解析XML步骤(DOM方式) 获取DocumentBuilderFactory实例DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 通过Factory获取DocumentBuilder解析器对象实例DocumentB
9、uilder db = dbf.newDocumentBuilder(); 加载要解析的XML文档,获取Document对象Document doc = db.parse(new FileInputStream(xmlfile/students.xml); 对Document对象进行操作动态生成XML文档, 并写入文件 创建Document实例 获取DocumentBuilderFactory实例DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 通过Factory获取DocumentBuilder解析器对象实例
10、DocumentBuilder db = dbf.newDocumentBuilder(); 创建一个新的Document对象Document doc = db.newDocument(); 添加一系列的元素Element rootElt = doc.createElement(班级); Element studentElt1 = doc.createElement(学生); Element studentElt1_name = doc.createElement(姓名); studentElt1_name.setTextContent(张曼玉); studentElt1_name.setAt
11、tribute(别名, 玉姐); Element studentElt1_sex = doc.createElement(性别); studentElt1_sex.setTextContent(女); studentElt1.appendChild(studentElt1_name); studentElt1.appendChild(studentElt1_sex); Element studentElt2 = doc.createElement(学生); Element studentElt2_name = doc.createElement(姓名); studentElt2_name.se
12、tTextContent(林青霞); studentElt2_name.setAttribute(别名, 霞妹); Element studentElt2_sex = doc.createElement(性别); studentElt2_sex.setTextContent(女); studentElt2.appendChild(studentElt2_name); studentElt2.appendChild(studentElt2_sex); rootElt.appendChild(studentElt1); rootElt.appendChild(studentElt2); doc.a
13、ppendChild(rootElt); 获取TransfomerFactory实例TransformerFactory tff = TransformerFactory.newInstance(); 通过TransfomerFactory创建Transformer实例Transformer tf = tff.newTransformer(); 通过Document生成DOMSource实例DOMSource sourse = new DOMSource(doc); 创建写DOM文档的输出流StreamResult xmlResult = new StreamResult(new FileOu
14、tputStream(test.xml); 通过Transfomer的transform方法把DOMSource对象写入输出流tf.transform(sourse, xmlResult);JAXP方式解析XML步骤(SAX方式)SAX解析XML步骤1) SAXPerserFactory spf = SAXPerserFactory.newInstance();2) SAXParser sp = spf.newSAXParser();3) sp.parse(“test.xml”, new MyHandler();SAX主要用于对XML文档解析, 不能去修改, 删除, 添加元素SAX是推行机制,
15、 把发现的内容告诉程序员(函数), 程序员可以自己决定如何处理DefaultHandler SAX事件 startDoucment()发现文档的开始, 解析器开始扫描文档 endDocument()发现了文档尾() startElement()发现了一个起始标签, 返回元素名, 以及所有属性名和值 character()发现了一些文本, 将得到一个字符数组, 该数字符数组的偏移量和长度变量, 有这三个变量可以得到解析器发现的文本 endElement()发现一个结束标签, 并返回元素名称DOM模型(Document Object Model)Parent, Children, Siblingd
16、escendant, ancestorJDOM解析XML文档(第三方, 非JavaSE官方发布的内容)JDOM www.jdom.org解析步骤: 创建JDOM XML文档解析器对象SAXBuilderSAXBuilder builder = new SAXBuilder(); 通过输入流或文件对象(File)加载XML文档, 并可得到Document对象(org.jdom.Document;)Document doc = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream(gobal
17、-configure.xml); 通过Document对象获得DOM的根节点Element rootElt = doc.getRootElement();现在咱们就可以通过rootElt对这个DOM进行操作了生成步骤 创建Document实例(org.jdom.Document) Document doc = new Document(); Element rootElt = new Element(selects); Element childElt1 = new Element(select); Element childElt1_name = new Element(name); chi
18、ldElt1_name.setText(重庆市); childElt1_name.setAttribute(id, 1); childElt1.addContent(childElt1_name); rootElt.addContent(childElt1); Element childElt2 = new Element(select); Element childElt2_name = new Element(name); childElt2_name.setText(贵州省); childElt2_name.setAttribute(id, 2); childElt2.addConten
19、t(childElt2_name); rootElt.addContent(childElt2); doc.addContent(rootElt);/Document document = new Document(rootElt); 创建XMLOutputter实例XMLOutputter outer = new XMLOutputter(); 这里还可以指定格式和设置编码Format format = Format.getPrettyFormat();format.setEncoding(GB2312);XMLOutputter outer = new XMLOutputter();out
20、er.setFormat(format); 通过输出流和XMLOutputter的output方法把Document写入文件outer.output(doc, new FileOutputStream(TestJDomWriteXML.xml);DOM4J步骤这里就可以通过看我的例子作业: 通过DOM4J把今天的读写XML的例子重新写一遍 完成课本后面的所有习题 自学XPath, 通过例子和手册学习(XPathTutorial.chm)课后作业第4题(Page:37)test4.xml 89 78 67 80 ReadTest4XML.javapackage net.vzhang.xml.te
21、st;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;impo
22、rt org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class ReadTest4XML public static void main(String args) DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new FileInputSt
23、ream(test4.xml); Element rootElt = doc.getDocumentElement(); / System.out.println(rootElt); int count = 0; double sum_math = 0; double sum_phy = 0; NodeList eltList = rootElt.getChildNodes(); for(int i = 0; i eltList.getLength(); i+) Node node = eltList.item(i); if(node.getNodeType() = Node.ELEMENT_
24、NODE) count+; NodeList nodeList = node.getChildNodes(); for(int ii = 0; ii nodeList.getLength(); ii+) Node cnode = nodeList.item(ii); if(cnode.getNodeType() = Node.ELEMENT_NODE) String name = cnode.getNodeName(); String value = cnode.getTextContent(); if(name.equals(数学) sum_math += Integer.parseInt(
25、value); if(name.equals(物理) sum_phy += Integer.parseInt(value); System.out.println(总人数: + count + , 数学平均成绩: + sum_math / count + , 物理平均成绩: + sum_phy / count); catch (ParserConfigurationException e) / TODO Auto-generated catch block e.printStackTrace(); catch (FileNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (SAXException e) / TODO Auto-g
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1