JAVAWEB第五天xml解析

一、xml解析简介方式
有两种方式:(1)DOM(2)sax
(1)根据xml的层级结构在内存中分布一个树形结构,把xml的标签、属性、文本都封装成对象。优点:便于增删改操作。缺点:如果文件过大,会造成内存溢出。
(2)采用事件驱动的方式,边读边解析,从上到下,一行一行的解析,解析到某一个对象,返回对象名称。缺点:不能实现增删改操作。优点:查询方便,不会出现内存溢出
二、xml解析开发包
1.sun公司提供的JXSP
2.开源组织提供的Dom4j
三、jaxp是JAVASE的一部分,他的解析器在java.xml.parses包中,包中有4个类是关于dom和sax解析的
1.关于dom的:DoucumentBuilder:解析器类
DocumentBuilderFactory:解析器工厂
2.关于sax的:SAXParser:解析器类
SAXParserFactory:解析器工厂
四、详解有关dom解析器类
1.DoucumentBuilder:解析器类,是抽象类,不能够new,可以通过DocumentBuilderFactory.newDocumentBuilder();方法来获取,
2.DocumentBuilderFactory:解析器工厂,这个类也是抽象类,需要通过newInstance()获取DocumentBuilderFactory的实例。
3.解析时通过一个方法:parse(“xml路径”),返回一个document整个文档,返回的document是一个借口,他的父接口是Node,如果方法在document里找不到,可以到Node里寻找。
4.在document里面方法和js中的很多类似

getElementByTagName("标签名称");//得到标签名称
creatElement();创建标签
creatTextNode();创建文本
appendChild();添加节点
removeChild();删除节点
getParentNode();获取当前节点的父节点
getTextContent();得到标签里的值

对于getElementByTagName()返回是一个NodeList,其中他有两个方法,一个是getlength();获取这个集合的长度,另一个是item(idenx),通过下标获取具体的值。

遍历(这是JAVA代码,不是js)假如NodeList名称为list

for(int i=0;i<list.getlength();i++){
      list.item(i);
}

五、jaxp实现查询操作
步骤及案例
Person.xml

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
       <name>zhangsan</name>
       <age>20</age>
    </p1>
    <p1>
       <name>lisi</name>
       <age>30</age>
    </p1>
</person>

Test.java

public class Test {

    public static void main(String[] args) throws Exception {
        //查询所有name元素的值
        /*
         * 1.创建解析器工厂
         * 2.根据解析器工厂创建解析器
         * 3.解析解析器返回document
         * 4.得到所有的name元素
         * 5.遍历集合
         */
        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        Document document=builder.parse("src/Person.xml");
        NodeList list=document.getElementsByTagName("name");
        for(int i=0;i<list.getLength();i++){
            Node name=list.item(i);
            //得到name的值
            name.getTextContent();
            System.out.println(name);
        }

    }

}

六、使用jaxp添加节点
所有步骤和js中类似,最主要的一步是:回写到文件里,因为根据dom解析的特点,他是在内存中操作的,所以文件里不会存在,所以要回写到文件中,要在main方法中调用该方法才起作用

public static void selectsin() throws Exception {
        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        Document document1=builder.parse("src/Person.xml");
        NodeList list=document1.getElementsByTagName("p1");
        Node p1=list.item(0);
        Element sex1=document1.createElement("sex");
        Text text1=document1.createTextNode("nv");
        sex1.appendChild(text1);
        p1.appendChild(sex1);
        //回写
        TransformerFactory formerFactory=TransformerFactory.newInstance();
        Transformer transformer=formerFactory.newTransformer();
        //transform("xmlsource","result");方法,将xmlsource转换为result
        //DOMSource domsource=new DOMSource(document1);
        //StreamResult streamresult=new StreamResult("src/Person.xml");
        transformer.transform(new DOMSource(document1), new StreamResult("src/Person.xml"));


    }

七、修改sex
直接获取sex以后,使用setTextContent(“要修改为的值”);然后再回写到xml中
八、删除
获取父节点,通过父节点进行删除,然后回写到xml中

Node p1=list.item(0);
p1.removeChild("name");

九、遍历

private static void list1(Node node) {
        if(node.getNodeType()==Node.ELEMENT_NODE) {
            System.out.println(node.getNodeName());
        }
        //得到第一层子节点
        NodeList list=node.getChildNodes();
        for(int i=0;i<list.getLength();i++){
            Node node1=list.item(i);
            //得到name的值
            list1(node1);
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值