博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DTD和schema小总结
阅读量:7232 次
发布时间:2019-06-29

本文共 8500 字,大约阅读时间需要 28 分钟。

hot3.png

一、DTD简单介绍

180512_bvWU_1417419.png

上面的是DTD存在于xml文件里的场合,分离时是怎么设置的呢?(差异不大,在xml中使用SYSTEM引入便可)

DTD文件:

xml文件

二、schema入门

2.1 命名空间

181420_mPkE_1417419.png

在xml中引入schema

182023_anSO_1417419.png

182034_KlB0_1417419.png

2.2 元素和属性

182542_RHhD_1417419.png

182543_Ql5J_1417419.png

schema文件

引用上面schema文件的xml文件

Java in action
Java is good
Bruce
SOA in action
soa is difficult
Jike

2.3 相关的设计方案

1、Russian Doll【如上面的例子】

只有一个根元素,通过嵌套的方式完成编写

优点:结构清晰,根元素只有一个

缺点:元素无法重用

2、Salami Slice

优点:能够进行最大化重用

缺点:根元素不清晰

3、Venetian Blind

184621_L2z7_1417419.png

2.4 schema之间的相互引用

student.xsd文件

classroom.xsd文件

三、Stax处理xml

3.1 根据光标查找

book.xml

  
Everyday Italian  
Giada De Laurentiis
  
2005
  
30.00
  
Harry Potter  
J K. Rowling
  
2005
  
29.99
  
XQuery Kick Start  
James McGovern
  
Per Bothner
  
Kurt Cagle
  
James Linn
  
Vaidyanathan Nagarajan
  
2003
  
49.99
  
Learning XML  
Erik T. Ray
  
2003
  
39.95

212207_vvVQ_1417419.png

@Test	public void test02() {		XMLInputFactory factory = XMLInputFactory.newInstance();		InputStream is = null;		try {			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");			XMLStreamReader reader = factory.createXMLStreamReader(is);			while(reader.hasNext()) {				int type = reader.next();				if(type==XMLStreamConstants.START_ELEMENT) {					String name = reader.getName().toString();					if(name.equals("book")) {						System.out.println(reader.getAttributeName(0)+":"+reader.getAttributeValue(0));					}				}			}		} catch (XMLStreamException e) {			e.printStackTrace();		} finally {			try {				if(is!=null) is.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}

212312_1idw_1417419.png

@Test	public void test03() {		XMLInputFactory factory = XMLInputFactory.newInstance();		InputStream is = null;		try {			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");			XMLStreamReader reader = factory.createXMLStreamReader(is);			while(reader.hasNext()) {				int type = reader.next();								if(type==XMLStreamConstants.START_ELEMENT) {					String name = reader.getName().toString();					if(name.equals("title")) {						System.out.print(reader.getElementText()+":");					}					if(name.equals("price")) {						System.out.print(reader.getElementText()+"\n");					}				}			}		} catch (XMLStreamException e) {			e.printStackTrace();		} finally {			try {				if(is!=null) is.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}

212512_lYyg_1417419.png

3.2 基于迭代模型的查找

@Test	public void test04() {		XMLInputFactory factory = XMLInputFactory.newInstance();		InputStream is = null;		try {			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");			//基于迭代模型的操作方式			XMLEventReader reader = factory.createXMLEventReader(is);			int num = 0;			while(reader.hasNext()) {				//通过XMLEvent来获取是否是某种节点类型				XMLEvent event = reader.nextEvent();				if(event.isStartElement()) {					//通过event.asxxx转换节点					String name = event.asStartElement().getName().toString();					if(name.equals("title")) {						System.out.print(reader.getElementText()+":");					}					if(name.equals("price")) {						System.out.print(reader.getElementText()+"\n");					}				}				num++;			}			System.out.println(num);		} catch (XMLStreamException e) {			e.printStackTrace();		} finally {			try {				if(is!=null) is.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}

212942_2Z3U_1417419.png

3.3 过滤器的使用

@Test	public void test05() {		XMLInputFactory factory = XMLInputFactory.newInstance();		InputStream is = null;		try {			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");			//基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一些			XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),					new EventFilter() {						@Override						public boolean accept(XMLEvent event) {							//返回true表示会显示,返回false表示不显示							if(event.isStartElement()) {								String name = event.asStartElement().getName().toString();								if(name.equals("title")||name.equals("price"))									return true;							}							return false;						}					});			int num = 0;			while(reader.hasNext()) {				//通过XMLEvent来获取是否是某种节点类型				XMLEvent event = reader.nextEvent();				if(event.isStartElement()) {					//通过event.asxxx转换节点					String name = event.asStartElement().getName().toString();					if(name.equals("title")) {						System.out.print(reader.getElementText()+":");					}					if(name.equals("price")) {						System.out.print(reader.getElementText()+"\n");					}				}				num++;			}			System.out.println(num);		} catch (XMLStreamException e) {			e.printStackTrace();		} finally {			try {				if(is!=null) is.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}

213411_9BSB_1417419.png

3.4 XPath的使用

@Test	public void test06() {		InputStream is = null;		try {			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");			//创建文档处理对象			DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();			//通过DocumentBuilder创建doc的文档对象			Document doc = db.parse(is);			//创建XPath			XPath xpath = XPathFactory.newInstance().newXPath();			//第一个参数就是xpath,第二参数就是文档			NodeList list = (NodeList)xpath.evaluate("//book[@category='WEB']", doc,XPathConstants.NODESET);			for(int i=0;i

213821_rvBv_1417419.png

3.5 使用XMLStreamWriter创建xml

@Test	public void test07() {		try {			XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);			xsw.writeStartDocument("UTF-8","1.0");			xsw.writeEndDocument();			String ns = "http://11:dd";			xsw.writeStartElement("nsadfsadf","person",ns);			xsw.writeStartElement(ns,"id");			xsw.writeCharacters("1");			xsw.writeEndElement();			xsw.writeEndElement();			xsw.flush();			xsw.close();		} catch (XMLStreamException e) {			e.printStackTrace();		} catch (FactoryConfigurationError e) {			e.printStackTrace();		}	}

214243_pvUk_1417419.png

3.6 使用Transformer更新节点信息

@Test	public void test08() {		InputStream is = null;		try {			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");			//创建文档处理对象			DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();			//通过DocumentBuilder创建doc的文档对象			Document doc = db.parse(is);			//创建XPath			XPath xpath = XPathFactory.newInstance().newXPath();			Transformer tran = TransformerFactory.newInstance().newTransformer();			tran.setOutputProperty(OutputKeys.ENCODING,"UTF-8");			tran.setOutputProperty(OutputKeys.INDENT, "yes");			//第一个参数就是xpath,第二参数就是文档			NodeList list = (NodeList)xpath.evaluate("//book[title='Learning XML']", doc,XPathConstants.NODESET);			//获取price节点			Element be = (Element)list.item(0);			Element e = (Element)(be.getElementsByTagName("price").item(0));			e.setTextContent("333.9");			Result result = new StreamResult(System.out);			//通过tranformer修改节点			tran.transform(new DOMSource(doc), result);		} catch (ParserConfigurationException e) {			e.printStackTrace();		} catch (SAXException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		} catch (XPathExpressionException e) {			e.printStackTrace();		} catch (TransformerConfigurationException e) {			e.printStackTrace();		} catch (TransformerFactoryConfigurationError e) {			e.printStackTrace();		} catch (TransformerException e) {			e.printStackTrace();		} finally {			try {				if(is!=null) is.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}

转载于:https://my.oschina.net/heroShane/blog/204145

你可能感兴趣的文章
CH5102 Mobile Service
查看>>
POJ3635 Full Tank
查看>>
XML的两种读取方法
查看>>
jquery插件制作
查看>>
Python简单试题3
查看>>
Effective C++ 笔记
查看>>
hybris 定义 long String
查看>>
【眼见为实】自己动手实践理解数据库READ UNCOMMITED && SERIALIZABLE
查看>>
高并发和大流量解决方案--数据库缓存
查看>>
C# 中类和结构的区别
查看>>
nginx常用命令
查看>>
ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。...
查看>>
GridView中字符串太长处理方式
查看>>
侧滑动画
查看>>
20175318 2018-2019-2 实验二《Java面向对象程序设计》实验报告
查看>>
自定义控件的最基本了解和应用
查看>>
题解 CF191C 【Fools and Roads】
查看>>
phpStudy配置多站点多域名步骤,及遇到的403错误解决方式
查看>>
Fiddler (二) Script 用法
查看>>
js学习笔记之自调用函数和原型链
查看>>