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);
}