xml学习笔记

xml学习笔记

xml:

xml的简介:可拓展标记性语言
		标记性语言:html
			html里面的标签时固定的,每个标签都有自己特定的含义
		可拓展性:xml
			xml里面的标签可以自己定义,可以写中文的标签  <person></person>,<人物></人物>
	简介:
		xml是W3C组织发布的技术
		xml有两个版本 1.0和1.1   通常使用1.0版本(因为1.1版本不能向下兼容)
	用途:
		xml可以跟html一样显示数据,但是不是主要功能
		xml主要功能是用来存储数据的
	xml的应用:
		不同的系统之间传输数据
		用来表示生活中有关系的数据
		经常用在配置文件
			比如连接数据库上  如果修改数据库的信息,不需要修改源代码,只需要修改配置文件就可以了
	xml的语法:
		xml的文档申明
			创建文件  文件名.xml
			如果写xml,第一步必须要有一个文件申明(写了文件申明以后,表示写xml文件的内容)
			文档申明<?xml version="1.0" encoding="utf-8" ?>
				参数:
					version:xml的版本1.0(通用)或者1.1
					encoding:xml编码gbk、utf-8、iso8859-1(不包含中文)
					standalone:是否需要依赖于其他文件yes或者no
			xml的中文乱码解决
				将保存时候的编码和设置打开时候的编码保持一致,就不会出现乱码
		定义元素
			标签的定义:
				有开始必须有结束		<person></person>
				标签没有内容,可以在内部结束	<person/>
				标签可以嵌套,但是必须合理嵌套
				一个xml中,只能有一个跟标签,其他的标签都是这个标签下面的标签
				在xml中把空格和换行都当做内容来解析
					如下代码为不同的代码
					1. 	<a>123456</a>
					2. 	<a>
							123456
						</a>
				xml中标签的命名规则
					1.xml代码区分大小写
					2.xml的标签不能以数字和下划线开头
					3.xml的标签不能以xml、XML、Xml等开头
					4.xml的标签不能包含空格和冒号
					5.xml标签可以是中文
		定义属性
			html是标记性文档,可以有属性
			xml也是标记性语言,也可以有属性`在这里插入代码片`
			xml属性定义的要求
				1.一个标签上可以有多个属性
					如:<person id1="a" id2="b"></person>
				2.属性名称不能相同
					如:<person id1="a" id1="b"></person>
				3.属性名和属性之间使用=,属性值使用""或者''包起来
				4.xml属性的名称规范和元素的名称规范是一致的
		注释
			<!--这就是xml的注释方法-->
			注意:
				注释不能嵌套
				注释不能放到第一行,第一行必须放文档声明
		特殊字符
			如果想要在xml中显示a<b,将不能正常显示,因为xml会将<当做标签
			如果想要显示,则需要对特殊字符<进行转义
				<:&lt;
				>:&gt;
				&:&amp;
				":&quot;
				':&apos;
		CDATA区
			可以解决多个字符都需要转义的操作     if(a<b&&b<c&&d>f){}
			把这些内容放在CDATA区里面,就不需要转义了
			写法:
				<![CDATA[内容]]>
				如:<![CDATA[if(a<b&&b<c&&d>f){}]]>
			作用:把特殊字符当做文本,而不是标签显示
		PI指令(处理指令)
			可以在xml中设置样式
			设置的样式只对英文标签名称起作用,对于中文的标签名不起作用
			写法:
				<?xml-stylesheet type="text/css" href="css文件的路径"?>
	xml的约束条件
		用于限制一个文件中只能出现该有的标签信息,不能出现不相关的标签

		xml的约束技术:
			dtd约束
				步骤:
					创建一个dtd文件     如:约束文件.dtd
					xml中有多少个元素,在dtd文件中写所少个<!ELEMENT>
					判断元素是简单元素还是复杂元素
						复杂元素:有子元素的元素
							<!ELEMENT 元素名称 (子元素1,子元素2+,子元素3?,子元素4*)>
								无参数:该元素标签只能出现一次
								+:该元素标签只能出现1或者1+次
								?:该元素标签只能出现0或者1次
								*:该元素标签可以出现任意次
								,:表示元素标签出现的顺序
								|:表示只能出现上述元素标签中的一个(用于枚举)
						简单元素:没有子元素
							<!ELEMNET 元素名称 (#PCDATA)>
								(#PCDATA)----约束元素内容为字符串类型
								EMPTY----约束元素内容为空
								ANY----约束元素内容可以为任意值
					需要在xml文件中引入dtd文件
						<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
				注意:
					xml使用浏览器打开,只负责校验语法,并不负责校验约束
					如果想要校验xml约束,需要使用工具(MyEclipse)
				三种引入方式:
					引入外部的文件
						<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
					使用内部的文件
						在根元素上面加
						<!DOCTYPE 根元素名[
							dtd文件
						]
						>
					使用网络的dtd文件
						<!DOCTYPE 根元素名称 PUBLIT "dtd文件的名称" "dtd文档的url路径">
				使用dtd定义属性:
					语法:
						<!ATTLIST 元素名称
							属性名称 属性类型 属性的约束
						>
						类型属性:
							CDATA:字符串
								<!ATTLIST birthday
									IDbirth CDATA #REQUIRED
								>
							枚举:(属性1|属性2|属性3...)
								<!ATTLIST age
									IDage (age1|age2|age3) #REQUIRED
								>
							ID:值只能是字母和下划线开头
							<!ATTLIST name
								IDname ID #REQUIRED
							>
						属性的约束:
							#REQUIRED:属性必须存在
							#IMPLIED:属性可有可无
							#FIXED:属性值必须是设定的这个值,可以不存在,但是存在必须是固定值  #FIXED "AAA"
							直接值:相当于设置默认值。如果标签上不加这是用该默认值,加则使用所加值
				实体的定义:
					语法:<!ENTITY 实体名称 "实体值">
						<!ENTITY test "我是一个实体">
					引用:&test;
					注意:定义的实体需要写在内部的dtd中,写在外部的dtd中某些浏览器无法引用
			schema约束
				schema符合xml的语法规范,使用xml语法编写
				一个xml中可以存在多个schema文件,使用名称空间来区分(类似于java中的包名)
				schema里面支持跟多的数据类型
				schema语法更加复杂,不能替代dtd
				基本语法:
					步骤:
						创建schema文件,文件名.xsd
							根节点为:<schema>
							属性:
								xmlns="http://www.w3.org/2001/XMLSchema"  ----表示当前xml文件是一个约束文件
								targetNamespace="http://www.example.org/NewXMLSchema"  ----约束文件引用地址
								elementFormDefault="qualified"
						看xml中有多少个元素  在schema中便有多少个<element name=""><element>标签
						看简单元素还是复杂元素
							复杂元素
								<element name="person">
									<complexType>
										<sequence>
											子元素
										</sequence>	
									</complexType>
								</element>
							简单元素:需要写在复杂元素的<sequence></sequence>中间
							eg:
								xml文档:
									<?xml version="1.0" encoding="UTF-8"?>
									<person>
										<name>zhangsan</name>
										<age>20</age>
									</person>
								schema文档:
									<?xml version="1.0" encoding="UTF-8"?>
									<schema xmlns="http://www.w3.org/2001/XMLSchema" 
									targetNamespace="http://www.example.org/NewXMLSchema" 
									xmlns:tns="http://www.example.org/NewXMLSchema" 
									elementFormDefault="qualified">
										<element name="person">
											<complexType>
												<sequence>
													<element name="name" type="string"></element>
													<element name="age" type="int"></element>
												</sequence>	
											</complexType>
										</element>
									</schema>
									约束标签:
										<sequence>: ----表示元素出现的顺序
										<all>: ----表示元素只能出现一次
										<choice>: ----元素只能出现其中的一个
										注意:上述三种标签相斥
										<any></any>: ----引用任意一个元素
										<attribute name="必加属性名" type="类型" use="限制条件"></attribute>
											书写位置:
													</sequence>	
													<attribute name="必加属性名" type="类型" use="限制条件"></attribute>
												</complexType>
											name:xml必须出现的属性名
											type:属性类型
											use:限制条件,限制标签是否必须出现
									约束属性
										maxOccurs="unbounded": ----表示元素出现的次数
						在xml文件中引入schema文件
							schema文件的引入在跟标签中以属性格式引入
							<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
							xmlns="http://www.example.org/NewXMLSchema"
							xsi:schemaLocation="http://www.example.org/NewXMLSchema NewXMLSchema.xsd">
							解释:
								xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
									表示xml是一个被约束文件,"约束文件里的xmlns属性值"+"-instance"
								xmlns="http://www.example.org/NewXMLSchema"
									对应约束文档里面的targetNamespace标签值
								xsi:schemaLocation="http://www.example.org/NewXMLSchema NewXMLSchema.xsd">
									xsi:schemaLocation="targetNamespace标签值 空格 schema路径/schema文件名.xsd"
						复杂约束引入
							引入多个约束条件,可以给约束条件取别名,别名任取
							<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
							xmlns="http://www.example.org/NewXMLSchema"
							xmlns:别名="schema约束文件的targetNamespace标签值"
							xsi:schemaLocation="http://www.example.org/NewXMLSchema NewXMLSchema.xsd">
							xml中引用:
								<别名:name></别名:name>
		xml的解析:(写到java代码)
			js使用dom解析标记型文档:
				根据HTML的层级结构,在内存中分配一个树形结构,把HTML的标签、属性、文本都分装成对象
				document对象、element对象、属性对象、文本对象、Node节点对象
			xml的解析方式(技术):dom和sax
				dom解析:
					过程:
						根据xml的层级结构,在内存中分配一个树形结构,把xml的标签、属性、文本都分装成对象
					优点:
						很方便实现增删改操作
					缺点:
						如果文件过大,容易造成文件溢出
				sax解析:
					过程:
						采用事件驱动,边读边解析
						从上到下一行一行的解析,解析到某一个对象,把对象名称返回
					优点:
						文件过大,不会造成内存溢出,方便实现查询操作
					缺点:
						不能实现增删改操作
				想要解析xml,首先需要解析器
					sum公司,针对dom和sax解析器  jaxp
					dom4j组织,针对dom和sax解析器  dom4j(实际开发中使用最多)
					jdom组织,针对dom和sax解析器  jdom
				jaxp的api查看(参考JDK1.6 API帮助文档.CHM手册)
					jaxp是javase的一部分
					jaxp解析器在jdk的javax.xml.parsers包里面
						四个类:分别针对dom和sax解析使用的类
							dom:
								DocumentBuilder  解析器类
									这个类是一个abstract class(抽象类),不能使用new得到
									此类的实例可以从DocumentBuilderFactory.newDocumentBuilder() 方法获取
									一个方法可以解析xml,该方法为parse("xml的路径") 返回的是Document真个整个文档
									返回的document是一个接口,其父接口是Node
									在document里面的方法 
										getElementsByTagName(String tagName)
											这个方法可以得到标签
											返回集合NodeList
										creatElement(String tagName)
											创建标签
										createTextNode(String data)
											创建文本
										appendChild(Node newChild)
											把文本添加到标签下面
										removeChild(Node oldChild)
											删除节点
										getParentNode()
											获取父节点
										NodeList
											getLength()  得到集合的长度
											item(int index)  下标取到具体的值
										遍历方法:
											for(int i=0;i<list.getLength();i++){
												list.item(i);
											}
										getTextContent()
											得到标签里面的内容
								DocumentBuilderFactory  解析器工厂
									这个类也是一个abstract class(抽象类),不能使用new得到
									此类的实例可以从 newInstance() 方法获取
							sax:
								sax解析原理
									在javax.xml.parsers包里面
										SAXParser:解析器类
											此类的实例可以从SAXParserFactory.newSAXParser()方法获得
											parser(File f,DefaultHandler dh)
												参数一:xml的路径
												参数二:事件处理器
										SAXParserFactort:解析器工厂
											实例通过newInstance()方法获得
								sax解析过程:
									当解析到开始标签时,自动调用startElement(四个参数)方法,参数qName:返回标签名称
									当解析到文本内容时,自动调用characters(三个参数)方法,通过String的构造方法返回内容
									当解析到结束标签时,自动调用endElement(三个参数)方法,参数qName:返回标签名称
					使用jaxp的dom方式操作xml文档
						查询xml中所有的name元素值
							步骤:
								1.创建解析器工厂
									DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
								2.根据解析器工厂创建解析器
									DocumentBuilder builder = builderFactory.newDocumentBuilder();
								3.解析xml返回document
									Document document = builder.parse("src/person.xml");
								4.得到所有的name元素
									NodeList list = document.getElementsByTagName("name");
								5.得到name元素里面的内容
									for(int i=0;i<list.getLength();i++){
										//得到每一个name元素
										Node name1 = list.item(i);  
										//得到name元素里面的内容
										String s = name1.getTextContent();
										System.out.println(s);
									}
								查询xml中指定name元素的值
									1.创建解析器工厂
										DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();	
									2.根据解析器工厂创建解析器
										DocumentBuilder builder = builderFactory.newDocumentBuilder();
									3.解析xml返回document
										Document document = builder.parse("src/person.xml");
									4.得到所有的name元素
										NodeList list = document.getElementsByTagName("name");
									5.使用返回结合里面的方法item获取具体下标的元素(集合下标从0开始)
										Node name1 = list.item(0);
									6.得到具体的值,使用getTextContent方法
										String s = name1.getTextContent();
										System.out.println(s);
						使用jaxp添加节点
							1.创建解析器工厂
							2.根据解析器工厂创建解析器
							3.解析xml返回document
							4.得到参照元素,使用item方法通过下标的到
							5.创建sex标签,使用createElement
								Element sex1 = document.createElement("sex");
							6.创建文本,使用createTextNode
								Text text1 = document.createTextNode("sex_text");
							7.把文本添加到新建元素下面,使用appendChild
								sex1.appendChild(text1);
							8.把新建元素添加到参考元素下面
								p1.appendChild(sex1);
							9.回写xml
								TransformerFactory transformerFactory = TransformerFactory.newInstance();
								Transformer transformer = transformerFactory.newTransformer();
								transformer.transform(new DOMSource(document), new StreamResult("xml文档路径"));
						使用jaxp修改节点
							1.创建解析器工厂
							2.根据解析器工厂创建解析器
							3.解析xml返回document
							4.得到需要修改的标签
								Node sex1 = document.getElementsByTagName("sex").item(0);
							5.修改得到的标签的值,使用setTextContent
								sex1.setTextContent("nan");
							6.回写xml
						使用jaxp删除节点
							1.创建解析器工厂
							2.根据解析器工厂创建解析器
							3.解析xml返回document
							4.得到需要删除的标签
								Node sex1 = document.getElementsByTagName("sex").item(0);
							5.获得需要删除标签的父节点
								Node p1 = sex1.getParentNode();
							6.通过父节点删除指定标签
								p1.removeChild(sex1);
							6.回写xml
						使用jaxp遍历所有节点
							1.创建解析器工厂
							2.根据解析器工厂创建解析器
							3.解析xml返回document 
							
							使用递归实现
							
							4.得到根节点
							5.得到根节点的子节点
							6.类推.....

								private static void list1(Node node) {
									//打印父节点
									//判断元素类型----用来删除空格符合回车符
									if(node.getNodeType() == Node.ELEMENT_NODE){
										System.out.println(node.getNodeName());
									}
									//得到一层子节点
									NodeList list = node.getChildNodes();
									for(int i=0;i<list.getLength();i++){
										//得到每一个节点
										Node node1 = list.item(i);
										list1(node1);
									}
								}
					使用jaxp的sax方式操作xml文档
						sax方式不能实现增删改操作,只能做查询操作
						实现打印文本操作:
							1.创建解析器工厂
							2.创建解析器
							3.执行parse方法
							
							4.自己创建一个类,继承DefaultHandler
							5.重写类里面的三个方法
							eg:
								//创建解析器
								SAXParserFactory saxParserFacyory = SAXParserFactory.newInstance();
								//创建解析器
								SAXParser saxPaeser = saxParserFacyory.newSAXParser();
								//执行parse方法
								saxPaeser.parse("src/jaxp_sax.xml",new MyDefault());
								class MyDefault extends DefaultHandler{
									@Override
									public void startElement(String uri, String localName, String qName,
											Attributes attributes) throws SAXException {
										System.out.print("<"+qName+">");
									}								
									@Override
									public void characters(char[] ch, int start, int length)
											throws SAXException {
										System.out.print(new String(ch,start,length));
									}									
									@Override
									public void endElement(String uri, String localName, String qName)
											throws SAXException {
										System.out.print("</"+qName+">");
									}
								}
						获取所有指定标签的内容
							boolean flag = false ;
							@Override
							public void startElement(String uri, String localName, String qName,
									Attributes attributes) throws SAXException {
								//判断qName是否是name元素
								if("name".equals(qName)){
									flag = true ;
								}
							}
							@Override
							public void characters(char[] ch, int start, int length)
									throws SAXException {
								//当flag值为true时,表示解析到name元素,开始打印文本内容
								if(flag == true){
									System.out.println(new String(ch,start,length));
								}
							}
							@Override
							public void endElement(String uri, String localName, String qName)
									throws SAXException {
								//把flag设置为false,表示name元素结束
								if("name".equals(qName)){
									flag = false ;
								}
							}
						获取xml文档中指定标签的指定内容内容
							class MyNameDefault2 extends DefaultHandler{
								boolean flag = false ;
								int index = 1;
								@Override
								public void startElement(String uri, String localName, String qName,
										Attributes attributes) throws SAXException {
									//判断qName是否是name元素
									if("name".equals(qName)){
										flag = true ;
									}
								}
								@Override
								public void characters(char[] ch, int start, int length)
										throws SAXException {
									//当flag值为true时,表示解析到name元素,开始打印文本内容
									//想获得第几个标签的值就把index的值设为多少
									if(flag == true && index == 2){
										System.out.println(new String(ch,start,length));
									}
								}
								@Override
								public void endElement(String uri, String localName, String qName)
										throws SAXException {
									//把flag设置为false,表示name元素结束
									if("name".equals(qName)){
										flag = false ;
										index++ ;
									}
								}
								
							}
		使用dom4j解析xml
			dom4j不是javase的一部分,所以想要使用,则需要道路dom4j提供的jar包
				导入dom4j.jar包(下载地址:https://dom4j.github.io/)
					在项目处新建文件夹lib
					复制下载的dom4j-1.6.1.jar包放入文件夹lib
					右击dom4j-1.6.1.jar包,点击build path -- add to buildpath成功导入jar包
			得到document
				SAXReader reader = new SAXReader();
				Document document = reader.read(url);
				document里面的方法:(document的父接口是Node)
					getRootElement():获取根节点,返回值是Element
				Element里面的方法:(Element也是一个接口,父接口也是Node)
					getParent():获取父节点
					addElement():添加标签
					element(qname)
						qname:标签名称
						表示获取标签下面的第一个子标签
					elements(qname)
						qname:标签名称
						表示获取标签下面的所有子标签(非孙子标签)
					elements()
						获取标签下面的所有子标签
			使用dom4j查询xml文档
				查询所有指定元素里面的值
					例题:
						得到下面xml文档里的所有name值
						<?xml version="1.0" encoding="UTF-8"?>
						<person>
							<p1>
								<name>zhangsan</name>
								<age>20</age>
							</p1>
							<p1>
								<name>lisi</name>
								<age>25</age>
							</p1>
						</person>
						提示:以下例题的xml文档均用次文件
						步骤:
							1.创建解析器
								SAXReader saxReader = new SAXReader();
							2.得到document
								Document document = saxReader.read("src/dom4j_xml.xml");
							3.得到根节点  getParent()
								Element root = document.getRootElement();
							4.得到所有的p1标签
								List<Element> list = root.elements("p1");
							5.得到name
								遍历list
								for (Element element : list) {
									//element是每一个p1元素
									//得到p1下面的那么元素
									Element name1 = element.element("name");
							6.得到name里面的值
									String s = name1.getText();
									System.out.println(s);
								} 
							代码如下:
								//创建解析器
								SAXReader saxReader = new SAXReader();
								//得到document
								Document document = saxReader.read("src/dom4j_xml.xml");
								//得到根节点
								Element root = document.getRootElement();
								//得到p1
								List<Element> list = root.elements("p1");
								//遍历list
								for (Element element : list) {
									//element是每一个p1元素
									//得到p1下面的那么元素
									Element name1 = element.element("name");
									//得到name里面的值
									String s = name1.getText();
									System.out.println(s);
								} 
					查询第一个name元素的值
						//创建解析器
						SAXReader saxReader = new SAXReader();
						//得到document
						Document document = saxReader.read("src/dom4j_xml.xml");
						//得到根节点
						Element root = document.getRootElement();
						//得到第一个p1
						Element p1 = root.element("p1");
						//等到p1下面的name元素
						Element name1 = p1.element("name");
						//等到name的值
						String s1 = name1.getText();
						System.out.println(s1);
					查询第一个name元素的值
						//创建解析器
						SAXReader saxReader = new SAXReader();
						//得到document
						Document document = saxReader.read("src/dom4j_xml.xml");
						//得到根节点
						Element root = document.getRootElement();
						//得到所有的p1元素
						List<Element> list = root.elements("p1");
						//得到第二个p1元素
						Element p2 = list.get(1);
						//等到p1下面的name元素
						Element name1 = p2.element("name");
						//等到name的值
						String s1 = name1.getText();
						System.out.println(s1);
				使用dom4j对xml实现添加操作
					在第一个p1标签末尾添加一个<sex></sex>标签
						//创建解析器
						SAXReader saxReader = new SAXReader();
						//得到document
						Document document = saxReader.read("src/dom4j_xml.xml");
						//得到根节点
						Element root = document.getRootElement();
						//等到第一个p1元素
						Element p1 = root.element("p1");
						//在p1下下面直接添加元素
						Element sex1 = p1.addElement("sex");
						//在sex西下面添加文本
						sex1.setText("nv");
						//显示带有格式
						//OutputFormat format = OutputFormat.createPrettyPrint();
						//压缩格式显示
						OutputFormat format = OutputFormat.createCompactFormat();
						XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/dom4j_xml.xml"),format);
						xmlWriter.write(document);
						//流文件一定要有关闭文件
						xmlWriter.close();
				在特定位置添加元素
					在第一个p1下面的age标签之前添加<school>school.edu.cn</school>
						/**
						 * 
						 * 1.创建解析器
						 * 2.得到document
						 * 3.得到根节点  getParent()
						 * 
						 * 4.得到第一个的p1标签
						 * 5.获取p1下面的所有元素 
						 * 		element()方法 返回list集合
						 * 		使用list里面的方法,在特定位置添加元素
						 * 		创建元素,在元素下面创建文本  DocumentHelper.createElement("Element")
						 * 			add(int index,E element)
						 * 				第一个参数是位置下标,从0开始
						 * 				第二个参数是添加的元素
						 * 6.回写
						 * 
						 */
				使用dom4j对xml实现修改操作
					修改第一个p1下面的age元素的值<age></age>
						/**
						 * 
						 * 1、等到document
						 * 2、得到根节点,然后再得到第一个p1
						 * 3、得到第一个p1下面的age
						 * 4、修改age中的值
						 * 5、回写
						 * 
						 */
				使用dom4j对xml实现删除操作
					删除第一个p1下面的<school>school.edu.cn</school>元素
						/**
						 * 
						 * 1、得到document
						 * 2、得到根节点
						 * 3、得到第一个p1标签
						 * 4、得到第一个p1下面的school元素
						 * 5、删除(使用p1删除school)
						 		在p1上面执行remove(point)方法删除节点
						 * 6、回写
						 * 
						 */
				使用dom4j获取属性的操作
					获取第一个p1里面的属性id1的值
						/**
						 * 
						 * 1、得到document
						 * 2、得到根节点
						 * 3、得到第一个p1元素
						 * 4、得到p1里面的属性值
						 		String value = p1.attributeValue("id1");
						 * 
						 */
				使用dom4j支持xpath的操作(可以直接获取到某个元素)
					第一种形式
						/AAA/BBB/CCC:表示获取AAA下面的BBB下面的CCC
					第二种形式
						//AAA:表示获取所有的AAA,不管该元素为第几层元素
					第三种形式
						/*:表示获取所有元素
					第四种形式
						/AAA/BBB[1]:表示获取AAA下面的第一个BBB元素
						/AAA/BBB[last()]:表示获取AAA下面的最后一个BBB元素
					第五种形式
						//BBB[@id]:选择有id属性的BBB元素
					第六种形式
						//BBB[@id='b1']:表示选择含有属性id且其值为'b1'的BBB元素
					使用dom4j支持xpath的具体操作
						首先引入支持xpath的jar包,使用jaxen-1.1-beta-6.jar
						在dom4j里面提供了两种方法用来支持xpath
							selectNodes("xpath表达式")
								获取多个节点
							selectSingleNode("xpath表达式")
								获取一个节点
						实例:
							使用xpath实现查询xml中所有name元素的值   
								所有name元素的xpath表示://name
								使用selectNodes("//name");
								步骤和代码:
									/**
									 * 1、得到document
									 * 2、直接使用selectNodes("//name");方法获得所有name元素
									 * 
									 */
									//得到document
									Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
									//使用selectNodes("//name");方法获得所有name元素
									List<Node> list = document.selectNodes("//name");
									//遍历list集合
									for (Node node : list) {
										//node是每一个name元素
										//得到name元素里面的值
										String s = node.getText();
										System.out.println(s);
									}
							使用xpath实现获取xml中第一个p1下面的name元素的值
								xpath表示形式://p1[@id1='zs']/name
								使用selectSingleNode("//p1[@id1='zs']/name");
								步骤和代码:
									/**
									 * 1、得到document
									 * 2、直接使用使用selectSingleNode("//p1[@id1='zs']/name");实现
									 * 
									 */
									//得到document
									Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
									//直接使用使用selectSingleNode("//p1[@id1='zs']/name");实现
									Node name1 = document.selectSingleNode("//p1[@id1='zs']/name");
									//得到name里面的值
									String s = name1.getText();
									System.out.println(s);
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页