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同 ...
随机推荐
- Powerdesigner 连接mysql 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM014
系统环境: WIN7 64位系统, 用Powerdesigner 连接MySQL 逆向工程时 报错 "在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM01 ...
- 编译安装 Python3.6.1
操作系统 centos7.2 系统自带python版本 2.7.5 说明:编译python3的过程是简单的但比较慢,可以用连字符 && ,这样可以先去(忙其他的|喝茶|听音乐|聊妹), ...
- 使用百度云同步盘和Git Extensions进行代码托管
一.软件安装 百度云同步盘和Git Extensions的安装和配置略过. 二.建立Git代码库,以[GHO2VMDK转换工具]项目为例 1. 建立本地代码库 进入[GHO2VMDK转换工具]项目文件 ...
- SpringMVC详解(六)------与json交互
Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛.那么这篇博客我们主要谈谈在 SpringMVC 中,如何对 json ...
- Java入门(7)——循环和debug 调试
循环: while 循环: 格式: int i = 0; ① //初始化条件 while(i < 10) { ② //判断条件 System.out.println(i); ④ //循环 ...
- Java开发相关命名规范
JAVA文件命名规范 1.类命名 抽象类以 Abstract 或者 Base 开头.异常类以 Exception 作为后缀.枚举类以 Enum 作为后缀.工具类以 Utils 作为后缀(相应的包名最后 ...
- Android binder机制---概述
1.进程间通讯的原因 目前操作系统都使用虚拟存储技术,管理内存. 假设是32位机器,0-3G是用户空间,3-4G是系统使用.虚拟内存和逻辑内存都按4K分页.这样虚拟内存和逻辑内存就存在对应关系. 一个 ...
- 国内5家云服务厂商 HTTPS 安全性测试横向对比
随着 Chrome.Firefox 等浏览器对 HTTPS 的重视,国内众多云服务厂商都相继提供 SSL 证书申购服务,但是大家有没有注意到一个细节,不同厂家申请的 SSL 证书,由于证书性能.功能差 ...
- 读取xml文件中节点
/// <summary> /// /// </summary> /// <param name="xmlpath">节点路径</para ...
- Tornado(cookie、XSRF、用户验证)
--------------------Cookie操作-------------------- 1.设置Cookie 1.set_cookie(name,value,domain=Non ...