XML知识点

<!doctype html>
<html lang="en">
 <head>
  <title>day</title>
  <meta name ="day" charset="UTF-8">
 </head>
 <body>
  <pre>
		1、XML 简介
			*extensible Markup Language :可扩展标记型语言
				-标记型语言:html是标记型语言
				
				-也是使用标签来操作
				
				-可扩展
					--html里面的标签是固定,每个标签都有特定的含义
					--标签可以自己定义,可以写中文的标签
				 
			*xml用途
				-html是用于显示数据,xml也可以显示数据(不是主要功能)
				
				-xml主要功能,为了存储数据

				-xml是w3c组织发布的技术

				-xml有两个版本 1.0 1.1 ,目前都是1.0,因为1.1不能向下兼容
		
		2、xml应用
			*不同的系统之间传输数据
				-qq之间数据的传输
				-画图分析过程
			
			*用来表示生活中有关系的数据

			*经常用在配置文件
				-比如现在连接数据库,肯定知道数据库的用户名和密码,数据名称
				-如果修改数据库的信息,不需要修改源代码,只需要修改配置文件就可以了
			
		3、xml的声明
			-xml的文档声明
				--创建一个文件,后缀是 .xml
				--如果写xml,第一步,必须要有个文档声明,且必须放在第一行
				<?xml version="1.0" encoding="utf-8"  standalone="no"?>
				--属性
					*version : 1.0
					*encoding: gbk utf-8 iso8859-1(不包含中文)
					*standalone:表示xml是否独立,是否依赖其他文件

			-定义元素(标签)
			-定义属性
			-注释
				<!-- 注释内容 -->  不能嵌套,不能放第一行
			-特殊字符
			-CDATA
			-PI指令:css xml相关联
				<?xml-stylesheet type="text/css" href="showXML.css"?>
				--设置样式:只能对英文标签名称起作用,对于中文的标签名称不起作用

		4、xml的元素(标签)定义
			*标记
				-空标记
					--<空标记的名称 属性列表/>
					--<xia age="28" sex="nan"/>
					--不允许<和xia之间有空格
				
				-非空标记
					--<标记名称 属性列表></标记名称>
					--<name>xia<name>
					--不允许<和name之间有空格
				
				-一个xml中,只能有一个根标签
				
				-树形结构
				
				-在xml中,标签之间的空格换行都会被当做内容,文本数据和标记,其中的标记被称作标记的子标记。
				
				-标记的名称:由字母,数字,下划线(_),点(.),连字符(-)组成,但是必须以字母或者下划线开头。 区分大小写

				-名称中间不能包含 冒号(:)和 空格(' ')

			*特殊字符
				< : &lt;
				> : &gt;
				' : &apos;
				" : &quot;
				& : &amp;

			*CDATA段
				-解决实体引用和字符引用阅读困难
				<![CDATA[
					原样输出
				]]>
			
		5、xml中属性的定义
			*属性规则:
				-一个标签上可以有多个属性
				
				-属性名称不能相同
				
				-属性不体现数据的结构,只是数据的附加信息
				
				-属性名称和属性值之间使用 = ,属性值使用引号包起来(可以使单引号也可以是双引号)

				-xml属性命名规范和元素命名规范一致

		6、xml的元素约束
			*有效的xml文件
				-对xml的数据结构进行限制有两种方式:使用DTD(document type definition)和XMLschema,两者区别在,xmlschema是一个特殊得xml文件,而dta语法和xml不同

			*元素约束
				-格式:<!ELEMENT 标签名称 标记的约束条件>
					--<!ELEMENT userName(user*)>
					
					--<!ELEMENT 商店 (商店名称,开门时间,关门时间)>
					--<!ELEMENT 商店名称 (#PCDATA)>
					--<!ELEMENT 开门时间 (#PCDATA)>
					--<!ELEMENT 关门时间 (#PCDATA)>
			
			*XML和DTA关联
				-<!DOCTYPE 根标记名称 SYSTEM "DTD文件URL">

				-<!DOCTYPE 根标记名称 PUBLIC "正式公用标识符" "dtd文件url">
			
			*DTD三种引入方式
				-引入外部的文件
					<!DOCTYPE 根标记名称 SYSTEM "url">
				
				-网络dtd:<!DOCTYPE 根标记名称 PUBLIC "正式公用标识符" "url">

				-内部实体
					<!DOCTYPE 根标记名称[  dtd代码  ]>
				
				-XML和DTD相关联必须写在XML声明之后		

			*DTD中的元素
				-约束标记只包含文本数据(简单元素)
					<!ELEMENT 标记名称 (#PCDATA)>
				
				-约束子标记(复杂元素)
					<!ELEMENT 标记名称 (子标记列表,逗号隔开)>
					--注意这样的元素将元素约束xml文件中相应的标记只可以有子标记,不可以有显示文本数据,(\t\n\x0B\f\r)等
					--子标记顺序不可以颠倒
				
				-模拟限定符的使用
					+:尾部加该限定符子标记必出现一次或多次
					*:尾部加该限定符子标记可出现零次或多次
					?:尾部加该限定符子标记可出现零次或一次
					--<!ELEMENT 库存 (商品+,管理员?)>
					|:两者存在一个标记即可
					--<!ELEMENT 学历 (本科|硕士|博士)>
				
				-EMPTY和ANY(简单元素)
					-EMPTY:约束标记是空标记
					-ANY:没有任何约束
			
			*DTD完整性
				-不允许无穷嵌套
				-标记必须有元素对其进行约束

			*IGNORE:忽略DTD中约束条件 和 INCLUDE:包含约束条件
				-<![IGNORE[ 忽略的条件 ]]>
				-<![INCLUDE[ 包含的条件 ]]>

			*自定义实体引用
				-定义的实体需要写在内部DTD里面
				<!ENTITY 实体名称 "代表的值">
				-在xml中引用
					--&实体名称;

		
		7、DTD中的属性约束列表
			*<!ATTLIST 标记名称 属性名称 属性类型 默认值>
				-<!ATTLIST room width CDATA "0" length CDATA "0">
				
				-属性的默认值都是字符串"0"
				
				-属性值中都不能含有实体引用和字符引用
			
			*属性类型
				-CDATA:字符串,不能含有实体引用和在字符引用
				
				-Enumerated:属性值是枚举的 1|2
				
				-NMTOKEN:属性值不能含有空格
				
				-ID:ID类型的属性值必须互不相同,属性值以字母或者下划线开头,且属性值只能是#IMPLIED或#REQUIRED
				
				-IDREF:通过标记属性值来判断标记之间的联系,属性值只能取ID类型的属性值

			*属性的默认值
				-默认值是字符串:标记该属性默认值是red,标签如果在重新设置color 也没错,且以新值为算
					--<!ATTLIST desktop color CDATA "red">
				
				-#IMPLIED:标记可以没有该属性,没有默认值 或 #REQUIRED:标记必须有该属性,没有默认值
					--<!ATTLIST desktop color CDATA #IMPLIED>
					--<!ATTLIST desktop color CDATA #REQUIRED>
				
				-FIXED:标记可以没有该属性,如果有,属性值固定不变
					--<!ATTLIST desktop color CDATA #FIXED "字符串">

		8、xml的解析的简介
			*xml是标记型文档
			
			*js使用dom解析标记型文档?
				-根据html的层级结构,在内存中分配一个树形结构,把html的标签属性和文本都封装成对象
				-document,element,属性对象,文本对象,node节点

			*xml的解析方式(技术):DOM 和 SAX
				*画图分析使用dom和sax解析xml过程
				
				*dom解析方式
					-根据xml的层级结构在内存中分配一个树形结构,把xml的标签属性和文本都封装成对象
					-缺点:如果文件过大,造成内存溢出
					-优点:很方便实现增删改
				
				*sax解析方式
					-采用事件驱动,边读边解析。从上到下一行一行解析,解析到某个对象,返回对象名称
					-缺点:不能实现增删改操作
					-优点:如果文件过大,不会造成内存溢出,方便实现查询操作
				
			*想要解析xml,首先需要解析器
				-不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
					--sun公司提供了针对dom和sax解析器 : jaxp
					--dom4j组织提供了针对dom和sax解析器 : dom4j(实际开发中***)
					--jdom组织提供了针对dom和sax解析器 :jdom
			
		9、jaxp的API查看
			*JAXP:(Java API for XML Processing)开发包是se的一部分,有以下几个包及其子包组成:
				-org.w3c.dom:提供DOM方式解析XML的标准接口
				-org.xml.sax:提供SAX方式解析XML的标准接口
				-javax.xml:提供了解析XML文档的类

			*java.xml.parsers包中,定义了几个工厂类,通过这些类,得DOM和SAX解析对象:
				-DocumentBuilder:解析器类   DocumentBuilderFactory:解析器工厂
				-SAXParser:解析器类   ,SAXParserFactory:解析器工厂

			******JAXP*******主*******要******步*****骤****
				(1)使用javax.xml.parsers包中的DocumentBuilderFactory对象调用newInstance()实例化DocumentBuilderFactory对象
					-DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
				
				(2)使用DocumentBuilderFactory对象调用newDocumentBuilder()方法返回一个DocumentBuilder对象,该对象被称为DOM解析器
					-DocumentBuilder domParser = fatory.newDocumentBuilder();
				
				(3)DOM解析器对象调用public Document parser(File f)方法解析参数f指定XML文件,该方法返回对象就是实现了Document接口一个实例
					-Document document = donParser.parser(new File("student.xml"));
				
				(4)通过上面三步,DOM解析器domParser调用parser方法返回对象document是一些Node对象所构成,Node对象被习惯称为节点,这些节点组成树形结构,Document的结构和XML标记组成的结构是相同的,即document就是DOM解析器在内存中建立和XML文件相应的树形结构	

			*接口Document对象:
				-Element getElementById(String elementId) 
				返回具有带给定值的 ID 属性的 Element。
				
				-NodeList getElementsByTagName(String tagname) 
				按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。 
				
				-Element createElement(String tagName) 
				创建指定类型的元素。
				
				-Text createTextNode(String data) 
				创建给定指定字符串的 Text 节点。 
				
				- String getXmlEncoding() 
				作为 XML 声明的一部分,指定此文档编码的属性。 
				
				-boolean getXmlStandalone() 
				作为 XML 声明的一部分,指定此文档是否为独立文档的属性。 
				
				-String getXmlVersion() 
				 作为 XML 声明 的一部分指定此文档版本号的属性。
				 
				-Element getDocumentElement() 
				这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。 

				- DocumentType getDoctype() 
				与此文档相关的文档类型声明 

			*接口Node对象	
				-Node appendChild(Node newChild) 
				将节点 newChild 添加到此节点的子节点列表的末尾。 
				
				-Node removeChild(Node oldChild) 
				从子节点列表中移除 oldChild 所指示的子节点,并将其返回。 
				
				-Node replaceChild(Node newChild, Node oldChild) 
				将子节点列表中的子节点 oldChild 替换为 newChild,并返回 oldChild 节点。 
				
				-Node getParentNode() 
				此节点的父节点。 
	
				-Node getFirstChild() 
				此节点的第一个子节点。 
 				
				-Node getLastChild() 
				此节点的最后一个节点。 

				-Node cloneNode(boolean deep) 
				返回此节点的副本,即允当节点的一般复制构造方法。 
				
				- String getTextContent() 
				此属性返回此节点及其后代的文本内容。
				
				-NodeList getChildNodes() 
				包含此节点的所有子节点的 NodeList。 

				-void setTextContent(String textContent) 
				此属性返回此节点及其后代的文本内容。 
			
			*接口NodeList对象
				-int getLength() 
				列表中的节点数。 
				-Node item(int index) 
				返回集合中的第 index 个项。 

			*接口Element对象
				-String getTagName() 
				元素的名称。 
	
				-String getAttribute(String name) 
				 通过名称获得属性值。 

				- void setAttribute(String name, String value) 
				 添加一个新属性。 
			
			*回写xml(重点)
			//*****回写xml Transform对象
				-TransformerFactory factory1 = TransformerFactory.newInstance();
				
				-Transformer transformer  = factory1.newTransformer();
				
				-transformer.transform(new DOMSource(document), new StreamResult("src/student.xml"));

			*代码演示  student.java
					public static void deleteSex()throws Exception
					{
						//工厂
						DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
						//xml解析器
						DocumentBuilder domParser = factory.newDocumentBuilder();
						//document对象
						Document document = domParser.parse("src/student.xml");
						
						/*
						 * //NodeList对象
						NodeList nodeList = document.getElementsByTagName("sex");
						Node stu = nodeList.item(0);
						//得到sex 
						Node sex =stu.getLastChild();
						//删除sex
						stu.removeChild(sex);
						*/
						//NodeList 对象
						NodeList nodeList = document.getElementsByTagName("sex");
						//父节点stu
						Node sex = nodeList.item(0);
						Node stu = sex.getParentNode();
						//删除sex
						stu.removeChild(sex);
						
						//回写
						TransformerFactory factory1 = TransformerFactory.newInstance();
						Transformer transfomer = factory1.newTransformer();
						transfomer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
					}
					
					
					public static void modifySex() throws Exception
					{
						//创建解析器工厂
						DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
						//xml解析器
						DocumentBuilder  domParser = factory.newDocumentBuilder();
						//document对象
						Document document = domParser.parse("src/student.xml");
						//获取sex节点
						NodeList nodeList = document.getElementsByTagName("sex");
						Node sex = nodeList.item(0);
						//设置内容通过方法 setTextContent方法
						sex.setTextContent("woman");
						//回写xml
						TransformerFactory factory1 = TransformerFactory.newInstance();
						Transformer transformer = factory1.newTransformer();
						transformer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
					}
					
					public static void addSex() throws Exception
					{
						DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
						//xml解析器
						DocumentBuilder domParser = factory.newDocumentBuilder();
						//document
						Document document = domParser.parse(new File("src/student.xml"));
						//stu节点
						NodeList nodeList = document.getElementsByTagName("stu");
						//创建sex
						Element sex = document.createElement("sex");
						//创建文本
						Text text = document.createTextNode("man");
						//sex添加text,stu添加sex
						sex.appendChild(text);
						nodeList.item(0).appendChild(sex);
						
						//*****回写xml Transform对象
						TransformerFactory factory1 = TransformerFactory.newInstance();
						Transformer transformer  = factory1.newTransformer();
						transformer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
					}
					private static void myMethod()throws Exception {
						//创建解析工厂
						DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
						//创建解析器
						DocumentBuilder domParser = factory.newDocumentBuilder();
						//解析xml返回Document对象
						Document document = domParser.parse(new File("src/student.xml"));	
						//获取所有的节点并输出
						NodeList childNodes = document.getChildNodes();
						//得到name元素
						NodeList list = document.getElementsByTagName("name");	
						//遍历集合
						for(int i=0 ; i<list.getLength() ;i++)
						{
							//获得name节点
							Node name1 = list.item(i);
							//获取文本
							String text1 = name1.getTextContent();
							System.out.println(text1);
						}
						
						//xml声明相关信息
						System.out.println("xml Version:"+document.getXmlVersion());
						System.out.println("xml encoding:"+document.getXmlEncoding());
						System.out.println("xml standalone:"+document.getXmlStandalone());
						
						//XML文件根节点名称
						Element root = document.getDocumentElement();
						System.out.println("根节点名称:"+root.getNodeName());
						
						//获取DocumentType对象:该对象就是文档的根标记或者与其关联的DTD文件
						DocumentType root1 = document.getDoctype();
						System.out.println(root.getNodeName());
						System.out.println("------------------------------------------------------------");
						
						listElement(list);//调用函数输出所有节点
					}
					
					public static void selectSingle() throws Exception 
					{
						//DocumentBuilderFactory对象
						DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
						//DocumenBuilder对象
						DocumentBuilder domParser = factory.newDocumentBuilder();
						//解析xml,Document对象
						Document document = domParser.parse(new File("src/student.xml"));
						//NodeList集合
						NodeList nodeList = document.getElementsByTagName("name");
						//获取第一个name节点
						System.out.println(nodeList.item(0).getTextContent());
						
						
					}
					public static void listElement(NodeList nodeList) throws Exception
					{
						int size = nodeList.getLength();
						for(int i=0 ; i<size ; i++)
						{
							Node node = nodeList.item(i);
							if(node.getNodeType()==Node.TEXT_NODE)
							{
								System.out.println(node.getNodeType());
								Text textNode = (Text)node;
								String wholeText = textNode.getWholeText();
								System.out.println(wholeText);
							}
							if(node.getNodeType()==Node.ELEMENT_NODE)				
							{
								System.out.println(node.getNodeType());
								Element elementNode = (Element)node;
								String nodeName = elementNode.getNodeName();
								System.out.print(nodeName+":");
								NodeList nodes = elementNode.getChildNodes();
								listElement(nodes);
							}
						}
					}
  </pre>
 </body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_39531549/article/details/81354842