java web 学习第十一天——XML

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">

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值