1,Student类

package com.yangw.xml;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement //作为根节点的元素需要设置这个注解
public class Student {

    private int id;
    private String name;
    private int age;
    private Classroom classroom;

    public Student(int id, String name, int age, Classroom classroom) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.classroom = classroom;
    }
    ....  get set ...
}

2, Classroom对象

package com.yangw.xml;

public class Classroom {

    private  int id;
    private String name;    //班级名称
    private int grade;        //年级

    public Classroom(int id, String name, int grade) {
        super();
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    public Classroom() {
        super();
    }
    ... get  set  ...
}

3, 测试类,对象与xml互转

package com.yangw.xml;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.junit.Test;

public class TestJaxb {

    /**
     * 编排:对象转成xml
     */
    @Test
    public void test01() {

        try {
            JAXBContext ctx=JAXBContext.newInstance(Student.class);
            Marshaller marshaller=ctx.createMarshaller();

            Student stu=new Student(1,"张",20,new Classroom(1,"软件工程01",2008));
            //参数: 对象,输出流
            marshaller.marshal(stu, System.out);
        } catch (JAXBException e) {

            e.printStackTrace();
        }
    }

    /**
     * 反编排:xml转成对象
     */
    @Test
    public void test02() {

        try {
            JAXBContext ctx=JAXBContext.newInstance(Student.class);
            Unmarshaller um=ctx.createUnmarshaller();

            String xml="<?xml version='1.0' encoding='UTF-8' standalone='yes'?><student><age>20</age><classroom><grade>2008</grade><id>1</id><name>软件工程01</name></classroom><id>1</id><name>张</name></student>";
            //参数: 对象,输出流
            Student stu=(Student)um.unmarshal(new StringReader(xml));
            System.out.println(stu.getName()+"-->"+stu.getClassroom().getName());
        } catch (JAXBException e) {

            e.printStackTrace();
        }
    }

}

4, Stax解析xml

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>
package com.yangw.stax;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.XMLEvent;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestStax {

    /**
     * Stax,基于光标的解析xml
     */
    @Test
    public void test() {
        //1,创建工厂
        XMLInputFactory factory=XMLInputFactory.newInstance();
        //2,创建XMLStreamReader
        InputStream is=null;
        is=TestStax.class.getClassLoader().getResourceAsStream("books.xml");
        try {
            XMLStreamReader reader=factory.createXMLStreamReader(is);

            while(reader.hasNext()){
                switch(reader.next()){
                    case XMLStreamConstants.START_ELEMENT:
                        //获取开始标签名
                        String name=reader.getName().toString();
                        if("book".equals(name)){
                            //获取属性名属性值
                            System.out.println(reader.getAttributeName(0)+":"+reader.getAttributeValue(0));
                        }else if("price".equals(name)){
                            //获取节点的文本
                            System.out.println(reader.getElementText());
                        }
                        break;
                    case XMLStreamConstants.END_ELEMENT:
                        break;
                    case XMLStreamConstants.ATTRIBUTE:

                        break;
                    case XMLStreamConstants.CHARACTERS:

                        break;

                }//switch

            }//while
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }finally{
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Stax,基于迭代模型的解析xml
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test02() {
        //1,创建工厂
        XMLInputFactory factory=XMLInputFactory.newInstance();
        //2,创建XMLStreamReader
        InputStream is=null;
        is=TestStax.class.getClassLoader().getResourceAsStream("books.xml");
        try {
            XMLEventReader reader=factory.createXMLEventReader(is);

            while(reader.hasNext()){
                //通过XMLEvent来判断是否是某种节点
                XMLEvent event=reader.nextEvent();
                if(event.isStartElement()){
                    //先转换为开始节点,再获取值
                    QName qName=event.asStartElement().getName();

                    if("book".equals(qName.toString())){
                        //获取属性
                        //一个值的方式
                        Attribute attr1= event.asStartElement().getAttributeByName(new QName("category"));
                        System.out.println(attr1.getValue());
                        //多个值进行迭代
                        Iterator<Attribute> it=event.asStartElement().getAttributes();
                        while(it.hasNext()){
                            Attribute attr=it.next();
                            System.out.println(attr.getName()+":"+attr.getValue());
                        }
                    }else if("price".equals(qName.toString())){
                        //获取节点的文本
                        System.out.println(reader.getElementText());
                    }
                }

            }//while
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }finally{
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Stax,基于迭代模型的解析xml,增加了Filter
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test03() {
        //1,创建工厂
        XMLInputFactory factory=XMLInputFactory.newInstance();
        //2,创建XMLStreamReader
        InputStream is=null;
        is=TestStax.class.getClassLoader().getResourceAsStream("books.xml");
        try {
            //基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一点
            XMLEventReader reader=factory.createFilteredReader(factory.createXMLEventReader(is),
                    new EventFilter(){

                @Override
                public boolean accept(XMLEvent event) {
                    //能够接受的条件就返回true
                    if(event.isStartElement()){
                        //假如只过滤book节点
                        String name=event.asStartElement().getName().toString();
                        if("book".equals(name)){
                            return true;
                        }
                    }
                    return false;
                }});

            while(reader.hasNext()){
                //通过XMLEvent来判断是否是某种节点
                XMLEvent event=reader.nextEvent();
                if(event.isStartElement()){
                    //先转换为开始节点,再获取值
                    String name=event.asStartElement().getName().toString();

                    if("book".equals(name)){
                        //获取属性
                        //一个值的方式
                        Attribute attr1= event.asStartElement().getAttributeByName(new QName("category"));
                        System.out.println(attr1.getValue());
                        //多个值进行迭代
                        Iterator<Attribute> it=event.asStartElement().getAttributes();
                        while(it.hasNext()){
                            Attribute attr=it.next();
                            System.out.println(attr.getName()+":"+attr.getValue());
                        }
                    }else if("price".equals(name)){
                        //获取节点的文本
                        System.out.println(reader.getElementText());
                    }
                }

            }//while
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }finally{
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Stax,基于xPath的解析xml,它需要将这个文档加到内存中
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test04() {

        InputStream is=null;
        is=TestStax.class.getClassLoader().getResourceAsStream("books.xml");

        try {
            //DocumentBuilder
            DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
            //文档处理对象
            Document doc=builder.parse(is);

            XPath xPath=XPathFactory.newInstance().newXPath();
            //使用xPath查找
            // (表达式,源,返回类型急查找出来的类型)
            NodeList list=(NodeList) xPath.evaluate("//book[@category='WEB']", doc, XPathConstants.NODESET);
            for(int i=0;i<list.getLength();i++){
                //Node有很多的子类 ,这个返回的是Element
                Element ele=(Element) list.item(i); //book节点
                //获取该节点的title信息
                System.out.println(ele.getElementsByTagName("title").item(0).getTextContent());
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }

    }
}

5, 写xml。使用Stax

    /**
     * Stax,新建xml
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test05() {

        OutputStream ops=null;
        try {
            ops=System.out;

            XMLOutputFactory factory=XMLOutputFactory.newInstance();
            XMLStreamWriter writer=factory.createXMLStreamWriter(ops);

            writer.writeStartDocument("utf-8", "1.0");
            writer.writeEndDocument();

            String ns="http://yangw.com";
            writer.writeStartElement("yang", "person", ns);
            writer.writeNamespace("yang", ns);
            writer.writeNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
            writer.writeAttribute("id","1");
            writer.writeCharacters("yigeren");
            writer.writeEndElement();
            writer.flush();
            writer.close();
        } catch (FactoryConfigurationError e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XMLStreamException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

6, 修改xml内容

    /**
     * Stax,修改xml节点值,通过 Transformer   * 先通过Xpath查找,再通过 Transformer修改
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test06() {

        InputStream is=null;
        is=TestStax.class.getClassLoader().getResourceAsStream("books.xml");

        try {
            //DocumentBuilder
            DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
            //文档处理对象
            Document doc=builder.parse(is);

            XPath xPath=XPathFactory.newInstance().newXPath();

            Transformer tran=TransformerFactory.newInstance().newTransformer();
            tran.setOutputProperty(OutputKeys.ENCODING, "utf-8");
            tran.setOutputProperty(OutputKeys.INDENT, "yes");

            //使用xPath查找
            // (表达式,源,返回类型急查找出来的类型)
            NodeList list=(NodeList) xPath.evaluate("//book[title='Learning XML']", doc, XPathConstants.NODESET);
            //获取price节点
            Element be =(Element) list.item(0);
            Element e = (Element) be.getElementsByTagName("price").item(0);
            e.setTextContent("100.00");

            Result result=new StreamResult(System.out);
            //通过transformer修改节点
            tran.transform(new DOMSource(doc), result);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }

    }

webservice04#对象与xml转换-jaxb#Stax解析xml#新建修改xml的更多相关文章

  1. Java&Xml教程(七)使用JDOM修改XML文件内容

    JDOM提供了非常灵活的方式操作XML文件,使用JDOM非常简单而且代码简洁可读性强.前面我们学习了如何使用JDOM解析XML文件,本节介绍如何使用JDOM修改XML文件内容. 在这个教程中,我们准备 ...

  2. JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

    原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...

  3. Dom4j把xml转换成Map(固定格式)

    /** * 可解析list * * @param fileName * @return * @throws Exception */ @SuppressWarnings("unchecked ...

  4. XML 的4种解析方式

    在上一篇博客中,我们介绍了什么是 XML ,http://www.cnblogs.com/ysocean/p/6901008.html,那么这一篇博客我们介绍如何来解析 XML . 部分文档引用:ht ...

  5. 在Salesforce中处理Xml的生成与解析

    在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...

  6. java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml

    JDK1.5需要添加jar包,1.6以后就不需要了<dependency> <groupId>stax</groupId> <artifactId>st ...

  7. [转载] 使用StAX解析xml

    StAX 概述 从一开始,Java API for XML Processing (JAXP) 就提供了两种方法来处理 XML:文档对象模型(DOM)方法是用标准的对象模型表示 XML 文档:Simp ...

  8. [置顶] stax解析xml文档的6种方式

    原文链接:http://blog.csdn.net/u011593278/article/details/9745271 stax解析xml文档的方式: 基于光标的查询: 基于迭代模型的查找: 基于过 ...

  9. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

随机推荐

  1. JAVA在win10上的安装环境配置

    [TOC] 第一步: 打开右击电脑选择属性 第二步: 选择高级系统设置 第三部: 选择环境变量 第四部: 选择在系统变量中新建:JAVA_HOME 属性值为你的java的jdk的位置比如我的:E:\J ...

  2. ELK搭建指南(linux及Windows)

    当前公司系统使用mongodb记录日志,最近想对日志做可视化分析,尝试了exceptionless,感觉扩展性不高,所以尝试搭建elk,过程如下: ELK核心由三部分组成: Elasticsearch ...

  3. unittest单元测试流程

    整理了一个单元测试的完整流程,觉得很不错. 一个 test case 类应该派生自 unittest.TestCase正常的的test case的调用顺序为 from __future__ impor ...

  4. Mybatis分页插件PageHelper正确的使用方法(网上有2篇不够科学的文章)

    今天下午在Mybatis项目中,实现分页.因为我是后加入项目中的,Leader用的是PageHelper这个组件,但是我在实际使用的过程中遇到了2个大问题. 1.http://www.oschina. ...

  5. 大咖云集!IMWebConf 2017 前端大会即将在深圳盛大开幕

    2017年火热的夏季,一年一度的IMWebConf强势来袭!9月16日,深圳科兴国际会议中心,我们将全心全意打造一场前端盛宴,恭候各位的光临. 作为一名前端老鸟,笔者有幸也参与了本次的大会的主题分享& ...

  6. java web轻量级开发面试教程内容精粹:哪些简历得不到面试机会

    看到一本较好的实践性比较强的书,java web轻量级开发面试教程,里面的一些内容很有实践意义. 问题点 很难获得面试机会的原因 学历不符,比如要求是本科以上,但学历是大专 学历是硬指标,所以达不到学 ...

  7. jsp中button按钮单击莫名提交两次或刷新页面问题

    <button id="btn"></button>目前还不知道原因但是在button标签中加上type="button"属性即可解决问 ...

  8. Python学习笔记开篇

    已经快30岁了,中专学历,不会什么技术,因为好吃懒做最喜欢的就是吃肉睡觉. 每次想学习技术如PhotoShop,绘声绘影,PHP,易语言,按键精灵都只是3分钟热血. 今天我想在业余时间学习Python ...

  9. 关于我立牌坊那个SSM项目

    我这段时间有在写,但是我发现一个问题,就是我经常在做后面功能的时候要改前面一个东西,但是我博客已经发出来了,这让我很头疼.毕竟我博客基本都在纯贴代码. 所以决定暂时停更这个系列.等我写好了再上传到gi ...

  10. 启动tomcat错误:Address already in use: JVM_Bind:8081

    解决方法: 1.打开任务管理器,关闭掉javaw进程. 2.修改tomcat端口:tomcat/conf/server.xml