xml的schema约束

schema的快速入门
Schema 文件本身就是一个XML文件,但它的扩展名通常为.xsd。
和XML文件一样,一个Schema文档也必须有一个根结点,但这个根结点的名称为Schema

约束文档源码:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.example.org/1" 
 xmlns:tns="http://www.example.org/1" 
 elementFormDefault="qualified">
 		<element name="person">
 			<complexType>
 				<sequence>
 					<element name="name" type="string"></element>
 					<element name="age" type="int"></element>
 				</sequence>
 			</complexType>
 		</element>
</schema>
---------------------------------------------------
xml源码:
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/1"
xsi:schemaLocation="http://www.example.org/1 1.xsd"
>
	<name>关二爷</name>
	<age>30</age>
	
</person>

-------------------------------------------
/*解释:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示xml是一个被约束文件,给xmlns起个别名叫做xsi
xmlns="http://www.example.org/1"
是约束文档里面的targetNamespace
xsi:schemaLocation="http://www.example.org/1 1.xsd"
targetNamespace+空格+约束文档的路径
*/
约束文档源码:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.example.org/1" 
 xmlns:tns="http://www.example.org/1" 
 elementFormDefault="qualified"
 >
 		<element name="person">
 			<complexType>
 				<sequence>
 				<!-- <all> -->
 			<!-- 	<choice> -->
 					<element name="name" type="string" maxOccurs="unbounded"></element>
 					<element name="age" type="int"></element>
 				<!-- </choice> -->
 				<!-- </all> -->
 				</sequence>
 				<attribute name="id1" type="int" use="required"></attribute>
 			</complexType>
 		</element>
 
</schema>

Sequence:元素按照顺序出现
All:表示只能出现一次
Choice: 只能出现其中的一个

maxOccurs=“unbounded” 表示出现次数没限制
attribute写在<./sequence>后面:

<attribute name="id1" type="int" use="required"></attribute>
---------------------------------
解释:
name:属性名称
type:属性类型 int string
use:属性是否必须出现 required

这里是xml文件

<?xml version="1.0" encoding="UTF-8"?>
<person> 
  <p1> 
    <name>李白</name>  
    <age>21</age>  
    <sex>男生</sex>
  </p1>  
  <p1> 
    <name>杜甫</name>  
    <age>25</age> 
  </p1> 
</person>

使用jaxp的sax方式解析xml文件
sax方式只能查询,不能增删改

package day06;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class TestSax {
    
    

	public static void main(String[] args) throws Exception {
    
    
		// TODO Auto-generated method stub
//		1.创建解析器工厂
		SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
//		2.创建解析器
		SAXParser saxParser=saxParserFactory.newSAXParser();
		//执行parse方法
		saxParser.parse("src\\p1.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+">");
	}
	
}
--------------------------------------------------------------
解释:
执行parse()方法,第一个参数是xml文件的路径,第二个参数事件处理器,创建一个类,继承事件处理器类,重写里面的三个方法

获取name元素里面的内容

//其他不变,修改mydefault代码就行
----------------------------------------------------------------------
//获取name元素里面的值
class MyDefault2 extends DefaultHandler{
    
    
	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 {
    
    
		if("name".equals(qName)) {
    
    
			flag=false;
		}
	}
}

获取第一个name元素里面的内容

//获取第一个name元素里面的值
class MyDefault2 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里面的内容
		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++;
		}
	}

}

获取第二个name元素里面的内容

//得到第二个name元素里面的值
	public static void searchSecondElement() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到所有p1元素的集合
		List<Element> list=root.elements("p1");
		//得到第二个p1
		Element p1=list.get(1);
		//得到p1下面的name
		Element name=p1.element("name");
		//得到name下面的值
		String str=name.getText();
		System.out.println(str);
	}

使用dom4j查询xml
使用dom4j需要导入dom4j的jar包,他不是javase的一部分

查询所有name元素的值

public static void searchElement() throws DocumentException {
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到p1元素的集合
		List<Element> list=root.elements("p1");
		//遍历list
		for(Element element:list) {
    
    
			//element是每一个p1元素
			//得到p1下面的name元素
			Element name1=element.element("name");
			//得到name里面的值
			String str=name1.getText();
			System.out.println(str);
		}
	}

查询第一个name元素里面的值

//查询第一个name元素的值
	public static void searchFirstElement() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到第一个p1
		Element p1=root.element("p1");
		//得到p1下面的name元素
		Element name1=p1.element("name");
		//得到name里面的值
		String str=name1.getText();
		System.out.println(str);
	}

查询第二name元素里面的值

//得到第二个name元素里面的值
	public static void searchSecondElement() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到所有p1元素的集合
		List<Element> list=root.elements("p1");
		//得到第二个p1
		Element p1=list.get(1);
		//得到p1下面的name
		Element name=p1.element("name");
		//得到name下面的值
		String str=name.getText();
		System.out.println(str);
	}

使用dom4j实现添加操作

在p1下面添加元素

	public static void addElement() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
	    Element root=document.getRootElement();
	    //得到第一个p1元素
	   Element p1=root.element("p1");
	    //在p1下面添加元素
	   Element sex1=p1.addElement("sex");
	   //在sex里面添加内容
	   sex1.setText("男生");
	   //回写操作
	   OutputFormat format=OutputFormat.createPrettyPrint();
	   XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src\\\\p1.xml"),format);
	   xmlWriter.write(document);
	   xmlWriter.close();
	}

在特定位置添加元素

在p1下面的age标签之前添加元素

//在p1下面的age标签之前添加元素**
	public static void addAgeBeforce() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到第一个p1元素
		Element p1=root.element("p1");
		//得到p1下面的所有元素的集合
		List<Element> list=p1.elements();
		//创建元素
		Element school=DocumentHelper.createElement("school");
		//在元素下面添加文本
		school.setText("湖南工商大学");
		//在特定位置添加元素
		list.add(1, school);
		//回写操作
		OutputFormat Format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src\\p1.xml"), Format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

使用dom4j实现修改操作
修改第一个p1下面的age元素的值

//修改第一个p1下面的age元素的值
	public static void modifyAge() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到第一个p1元素
		Element p1=root.element("p1");
		//得到age元素
		Element age=p1.element("age");
		//修改age里面的值
		age.setText("30");
		//回写操作
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src\\p1.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

使用dom4j实现删除节点的操作
删除第一个p1下面的school元素

//	删除第一个p1下面的school元素
	public static void deleteSchool() throws Exception{
    
    
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//得到根节点
		Element root=document.getRootElement();
		//得到第一个p1元素
		Element p1=root.element("p1");
		//得到p1下面的school元素
		Element school=p1.element("school");
		//使用p1删除school元素
		p1.remove(school);
		//回写
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src\\p1.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

得到属性的值
得到第一个P1里面属性id的值

 public static void getAttribute() throws Exception {
    
    
    	 //得到解析器
    	 SAXReader saxReader=new SAXReader();
    	 //得到document
    	 Document document=saxReader.read("src\\p1.xml");
    	 //得到根节点
    	 Element root=document.getRootElement();
    	 //得到第一个p1元素
    	 Element p1=root.element("p1");
    	 //得到p1里面属性的值
    	 String value=p1.attributeValue("id");
    	 System.out.println(value);
     }

使用dom4j支持xpath的操作
默认情况下dom4j不支持xpath,如果想要在dom4j里面使用xpath,需要导入jar包

在dom4j里面提供两个方法来支持xpath
selectNodes(“xpath的路径”):获取多个节点
selectSingleNode(“xpath的路径”):获取一个节点

(1)第一种形式
/AAA/DDD/BBB:表示一层一层的,AAA下面DDD下面的BBB元素
  (2)第二种形式
    //BBB:表示获取所有元素名字是BBB的元素
  (3)第三种形式
    /*:获取所有的元素
  (4)第四种形式
    BBB[1]:表示获取第一个BBB元素
    BBB[last()]:表示获取最后一个BBB元素
  (5)第五种形式
    //BBB[@id]:表示获取所有名字是BBB并且元素上面有id属性的元素
  (6)第六种形式
    //BBB[@id=‘b1’]:表示获取所有名字是BBB且元素上面有id属性的值b1

使用xpath来实现查询所有的name元素的值

//查询所有的name元素里的值
	public static void selectName() throws Exception {
    
    
		// TODO Auto-generated method stub
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document=saxReader.read("src\\p1.xml");
		//使用selectNodes("//name")方法得到所有的name元素的集合
		List<Node> list=document.selectNodes("//name");
		//遍历list集合
		for(Node node:list) {
    
    
			//node就是每一个name元素
			//得到name元素里面的值
			String value=node.getText();
			System.out.println(value);
		}
	}
}

使用xpath实现获取第一个p1下面的name元素的值

//查询第一个p1下面的name元素的值
	public static void seleFirstName() throws Exception {
    
    
		// TODO Auto-generated method stub
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//获取document
		Document document=saxReader.read("src\\p1.xml");
		//使用selectSingleNode("//p1[@id='123456789']/name")获取p1下面的name元素 
		Node name1=document.selectSingleNode("//p1[@id='123456789']/name");
		//得到name元素里面的值
		String value=name1.getText();
		System.out.println(value);
	}

猜你喜欢

转载自blog.csdn.net/weixin_44421869/article/details/103028001