Javaweb第十一天学习

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的值

posted @ 2022-02-13 23:10  向尧  阅读(35)  评论(0)    收藏  举报