Day 11
Jaxp解析器在jdk的javax.xml.parsers包里面
使用Jaxp实现查询操作:
Person.xml
<?xml version="1.0"encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
</person>
TestJxap.java
//目的查询所有name元素的值
//1创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//根据解析器工厂创建解析器
DocumentBuilder builer= builderFactory.newDocumentBuilder();
//根据xml返回document
Document document=builer.parse("src/person.xml");
//得到name元素
NodeList list=document.getElementsByTagName("name");
//遍历
for(inti = 0;i<list.getLength();i++) {
Node name1= list.item(i);//得到每一个元素
//得到每一个元素的值
Strings= name1.getTextContent();
System.out.println(s);
}
使用jaxp添加节点
目标题目:在第一个P1下面添加一个性别女
publicstaticvoid AddSex() throws ParserConfigurationException,SAXException, IOException, TransformerException {
//创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//得到document
Document document = builder.parse("src/person.xml");
//得到p1
NodeList list = document.getElementsByTagName("p1");
//得到第一个p1
Node list1 = list.item(0);
//创建标签
Element sex1 = document.createElement("sex");
//创建文本
Text text1 = document.createTextNode("nv");
//添加文本到标签下
sex1.appendChild(text1);
//把sex1添加到p1
list1.appendChild(sex1);
//会写xml
TransformerFactory transformerfactory= TransformerFactory.newInstance();
Transformer trand = transformerfactory.newTransformer();
trand.transform(new DOMSource(document), new javax.xml.transform.stream.StreamResult("src/person.xml"));
}
注意:在添加完毕之后,元素不会添加到文件中,只会添加内存中,这时需要使用方法回写。
使用jaxp 修改节点
修改第一个P1下面的sex的内容是男:
publicstaticvoid update() throws ParserConfigurationException,SAXException, IOException, TransformerException {
//修改第一个P1里面的值为男
//创建解析器工厂
DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder document = document1.newDocumentBuilder();
//创建document
Document docu = document.parse("src/person.xml");
//得到P1
Node list = docu.getElementsByTagName("sex").item(0);
//修改
list.setTextContent("nan");
//回写xml
TransformerFactory trans= TransformerFactory.newInstance();
Transformer tran = trans.newTransformer();
tran.transform(new DOMSource((docu)), new javax.xml.transform.stream.StreamResult("src/person.xml"));}
删除sex
publicstaticvoid deny() throws ParserConfigurationException,SAXException, IOException, TransformerException {
//创建解析器工厂
DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder document = document1.newDocumentBuilder();
//创建document
Document docu = document.parse("src/person.xml");
//得到sex
Node sex1 = docu.getElementsByTagName("sex").item(0);
//得到sex的父节点
Node p1 =sex1.getParentNode();
//删除
p1.removeChild(sex1);
//回写
TransformerFactory trans = TransformerFactory.newInstance();
Transformer tran = trans.newTransformer();
tran.transform(new DOMSource((docu)), new javax.xml.transform.stream.StreamResult("src/person.xml"));
}
使用jaxp遍历节点
把所有的元素的名称都打印出来
注意:遍历之后打印出来的会有空格等其他的内容,需要先判断是否是元素
publicstaticvoid listElement() throwsException{
//创建解析器工厂
DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder document = document1.newDocumentBuilder();
//创建document
Document docu = document.parse("src/person.xml");
//编写一个递归方法实现遍历操作
list1(docu);
}
//递归遍历
privatestaticvoid list1(Node node) {
//判断是元素类型的时候才打印
if(node.getNodeType()==Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
//得到一层子节点
NodeList list = node.getChildNodes();
for(inti = 0; i<list.getLength();i++) {
//得到每一个节点
Node node1 = list.item(i);
list1(node1);
}
}
Xml的schema约束
det约束语法:<! ELEMENT 元素名称 约束>
**schema符合xml的语法规范,一个xml中可以有多个schema,多个schema使用名称空间来进行区分(类似于包名),dtd里面有PCTATA类型,但是schema中可以支持更多的数据类型,比如 年龄 只能是整数,在schema可以直接定义一个整数类型,语法更加的复杂。
schema的快速入门:
创建一个schema文件:后缀值 .xsd
在schema里面有属性 xmlns=http://www.w3.org/2001/XMLSchema
表示xml文件是约束文件
targetNamespace=http://www.example.org/1
使用schema约束直接通过这个地址引入约束文件
elementFormDefault="qualified"
表示质量良好的
步骤:1,看xml文件只中有多少个元素就写多少个<element>
<element name="person">//复杂元素
<complexType>
<sequence>
<element name="name"type="string"></element>简单
<element name="age"type="int"></element> 简单元素
</sequence>
</complexType>
</element>
在被约束文件中引入
<?xml version="1.0"encoding="UTF-8" standalone="no"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/1"
xsi:xsi:schemaLocation="http://www.example.org/1 1.xsd">
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
表示xml是一个被约束的文件
xmlns="http://www.example.org/1"
约束文档里面的targetNamespace的值
引入的文件名 |
targetNamespace的值 |
xsi:schemaLocation="http://www.example.org/1 1.xsd">