webservice04#对象与xml转换-jaxb#Stax解析xml#新建修改xml
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的更多相关文章
- Java&Xml教程(七)使用JDOM修改XML文件内容
JDOM提供了非常灵活的方式操作XML文件,使用JDOM非常简单而且代码简洁可读性强.前面我们学习了如何使用JDOM解析XML文件,本节介绍如何使用JDOM修改XML文件内容. 在这个教程中,我们准备 ...
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...
- Dom4j把xml转换成Map(固定格式)
/** * 可解析list * * @param fileName * @return * @throws Exception */ @SuppressWarnings("unchecked ...
- XML 的4种解析方式
在上一篇博客中,我们介绍了什么是 XML ,http://www.cnblogs.com/ysocean/p/6901008.html,那么这一篇博客我们介绍如何来解析 XML . 部分文档引用:ht ...
- 在Salesforce中处理Xml的生成与解析
在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...
- java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml
JDK1.5需要添加jar包,1.6以后就不需要了<dependency> <groupId>stax</groupId> <artifactId>st ...
- [转载] 使用StAX解析xml
StAX 概述 从一开始,Java API for XML Processing (JAXP) 就提供了两种方法来处理 XML:文档对象模型(DOM)方法是用标准的对象模型表示 XML 文档:Simp ...
- [置顶] stax解析xml文档的6种方式
原文链接:http://blog.csdn.net/u011593278/article/details/9745271 stax解析xml文档的方式: 基于光标的查询: 基于迭代模型的查找: 基于过 ...
- 利用JAXB实现java实体类和xml互相转换
1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...
随机推荐
- JAVA在win10上的安装环境配置
[TOC] 第一步: 打开右击电脑选择属性 第二步: 选择高级系统设置 第三部: 选择环境变量 第四部: 选择在系统变量中新建:JAVA_HOME 属性值为你的java的jdk的位置比如我的:E:\J ...
- ELK搭建指南(linux及Windows)
当前公司系统使用mongodb记录日志,最近想对日志做可视化分析,尝试了exceptionless,感觉扩展性不高,所以尝试搭建elk,过程如下: ELK核心由三部分组成: Elasticsearch ...
- unittest单元测试流程
整理了一个单元测试的完整流程,觉得很不错. 一个 test case 类应该派生自 unittest.TestCase正常的的test case的调用顺序为 from __future__ impor ...
- Mybatis分页插件PageHelper正确的使用方法(网上有2篇不够科学的文章)
今天下午在Mybatis项目中,实现分页.因为我是后加入项目中的,Leader用的是PageHelper这个组件,但是我在实际使用的过程中遇到了2个大问题. 1.http://www.oschina. ...
- 大咖云集!IMWebConf 2017 前端大会即将在深圳盛大开幕
2017年火热的夏季,一年一度的IMWebConf强势来袭!9月16日,深圳科兴国际会议中心,我们将全心全意打造一场前端盛宴,恭候各位的光临. 作为一名前端老鸟,笔者有幸也参与了本次的大会的主题分享& ...
- java web轻量级开发面试教程内容精粹:哪些简历得不到面试机会
看到一本较好的实践性比较强的书,java web轻量级开发面试教程,里面的一些内容很有实践意义. 问题点 很难获得面试机会的原因 学历不符,比如要求是本科以上,但学历是大专 学历是硬指标,所以达不到学 ...
- jsp中button按钮单击莫名提交两次或刷新页面问题
<button id="btn"></button>目前还不知道原因但是在button标签中加上type="button"属性即可解决问 ...
- Python学习笔记开篇
已经快30岁了,中专学历,不会什么技术,因为好吃懒做最喜欢的就是吃肉睡觉. 每次想学习技术如PhotoShop,绘声绘影,PHP,易语言,按键精灵都只是3分钟热血. 今天我想在业余时间学习Python ...
- 关于我立牌坊那个SSM项目
我这段时间有在写,但是我发现一个问题,就是我经常在做后面功能的时候要改前面一个东西,但是我博客已经发出来了,这让我很头疼.毕竟我博客基本都在纯贴代码. 所以决定暂时停更这个系列.等我写好了再上传到gi ...
- 启动tomcat错误:Address already in use: JVM_Bind:8081
解决方法: 1.打开任务管理器,关闭掉javaw进程. 2.修改tomcat端口:tomcat/conf/server.xml