xml解析之dom、dom4j、SAX

一、XML:
1、概念:可扩展标记语言,标签都是自定义的,就是一个记录,不需要编译
2、xml与html的区别:
1、html标签是预编译的,xml标签是自由发挥的
2、html主要是用于页面展示,xml拿来存数据的
3、html5也是目前跨平台开发的一个比较火的,它是html4+xml延伸出来的
3、基本结构:
1、第一行都是声明xml的信息,版本之间区别挺大的,使用时要注意。
2、下面部分就是文档的描述,例如有:元素节点(),属性节点id,文本节点
4、总结xml标签的语法注意:
1、必须有根节点
2、xml元素必须有结束标签
3、对大小写敏感
4、必须正确嵌套
5、同级标签缩进对齐
6、元素名称遵循驼峰命名(不能有空格)
5、xml解析器:
1、验证解析器:
1、主要为了检查dtd文件,(就相当于导包),例如mybaties框架哪些网址后缀都有dtd的,自己留意下
2、非验证解析器:专门检查xml语法
6、xml命名空间:(就是同一个xml文件避免出现同名的根标签,注意是根元素)
1、用前缀解决这种命名冲突,例如(f:books)
7、解析xml:
1、把它转化成一个dom对象,dom解析(还有其他的解析方法,dom4j解析(就是对dom的封装)、sax解析(主要用于移动端解析))
二、dom解析应用:
1、把xml文件转换成dom对象的步骤:
1、得到解析器工厂对象:DocumentBuilderFactory.newInstance();
2、得到真正的解析器对象:dbf.newDocumentBuilder();
3、得到xml文件的路径:File file=new File(“src/xml名字.xml”);
4、把文件转换成dom对象:doc=db.parse(file);//返回值就是Document对象doc

2、得到Brand标签的属性值以及其子类标签的属性值:
    1、得到标签名为Brand的集合:doc.getElementByTargetName("Brand");
    2、遍历上面那个集合:有点不一样是用集合.getLength()得到集合长度
    3、然后再遍历里面得到每一个Brand的具体节点:Node node=集合.item(i);
    4、然后将内个具体节点强转转为标签节点:Element eleName=(Element) node;
    5、输出标签名属性为name的属性值:String str=eleName.getAttribute("name");
    6、输出即可。

3、  删除一条属性name是三星的Brand标签:
    1、得到Brand标签集合:doc.getElementByTargetName("Brand");
    2、for循环遍历得到的集合:注意用listBrand.getLength();
    3、得到具体Brand的节点:listBrand.item(i);//得到一个obj对象
    4、强转节点为标签节点:Element eleBrand=(Element) obj;
    5、判断标签节点的属性name的值是否等于三星:if(eleBrand.getAttribute("name").equals("三星"));
    6、是就删除:eleBrand.getParentNode().removeChild(eleBrand);

4、增加一条属性为name="华为"Brand标签,里面还有一个子标签type,属性为name="华为note3":
    1、创建一个Brand标签:doc.createElement("Brand");
    2、创建一个type标签:doc.createElement("type");
    3、给Brand标签添加属性以及值:eleBrand.setAttribute("name","华为");
    4、给type标签添加属性以及值:eleType.setAttribute("name","华为note3");
    5、将type标签放到Brand标签中:eleBrand.appendChild(eleType);
    6、将整个Brand标签放到根标签里:doc.getElementByTargetName("phone").item(0).appendChild(eleBrand);

5、给所有Brand标签增加一个属性id,而且有值:
    1、得到Brand标签集合:doc.getElementByTargetName("Brand");
    2、for循环遍历得到的集合:注意用listBrand.getLength();
    3、得到具体Brand的节点:listBrand.item(i);//得到一个obj对象
    4、强转节点为标签节点:Element eleBrand=(Element) obj;
    5、eleBrand.setAttribute("id",i+1+"");

6、将新内容写入xml文件:
    public void writeXml(String path){
        //得到一个转换器工厂对象
        TransformerFactory tsf=TransformerFactory.newInstance();
        //得到转换器对象
        Transformer ts=tsf.newTransformer();
        //设置转换器格式为utf-8
        ts.setOutputProperty(OutputKeys.ENCODING,"utf-8");
        //得到DOMSource对象,参数是DOM对象doc
        DOMSource ds=new DOMSource();
        //得到ResultStream对象
        ResultStream rs=new ResultStream(new OutputStreamWriter(new FileOutputStream(path),"utf-8"));

        //利用transform方法进行转换,第一个参数是DOMSource对象,第二个是ResultStream对象
        ts.transform(ds,rs);
    }

三、dom4j的使用:(其实就是dom封装好的框架)
前戏导入dom4j包
1、得到DOM对象:

    1、SAXReader sr=new SAXReader();
    2、doc=sr.read(new File("src/phone.xml"));

2、得到Brand标签的属性值以及其子类标签的属性值:

    1、得到根节点:Element rootEle=doc.getRootElement();

    2、利用根节点得到标签迭代器:Iterator rootIterator=rootEle.elementIterator();

    3、while循环
    4、得到Brand节点对象:Object obj=rootIterator.next();

    5、强转为标签节点:Element brandEle=(Element) obj;

    6、得到属性值:String value=ele.attributeValue("name");//输出即可

    7、通过Brand标签节点得到迭代器:Iterator brandIterator=rootEle.elementIterator();

    8、while循环
    9、得到所有Brand下的节点:Object obj2=brandIterator.next();

    10、强转为标签节点:Element brandEle=(Element) obj2;

    11、得到属性值:String value2=ele.attributeValue("name");//输出即可

3、添加新的标签student

    1、得到根节点: Element rootEle=doc.getRootElement();

    2、直接添加新标签:Element studentEle=rootEle.addElelment("student");

    3、给新标签添加属性:studentEle.setAttributeValue("name","Sandy");//多个就写多几个就可以了

4、给原有的所有student添加一个id属性

    1、得到根节点:Element rootEle=doc.getRootElement();   

    2、得到迭代器:Iterator rootIte=rootEle.elementIterator();

    3、while循环

    4、得到每个节点对象:Object obj=rootIte.next();

    5、强转为标签节点:Element ele=(Element) obj;    

    6、添加属性以及值:ele.setAttributeValue("id",num+"");//这里num靠上几步的num++可以得到1、2、3 

5、将新DOM对象写入xml文件:


    1、得到opf对象:OutputFormat opf=OutputFormat.createOutputFprmat();

    2、设置输出格式:opf.setEconding("utf-8");

    3、利用核心XMLWriter xw=new XMLWriter(new FileOutputStream(new File(path),opf));//这里的path是靠传参进来的,opf对象在上面想办法搞出来

    4、可以把新DOM读到指定xml文件:xw.write(doc);

你可能感兴趣的:(xml)