您好,欢迎来到九壹网。
搜索
您的当前位置:首页JAXB解析xml的注解说明【转】

JAXB解析xml的注解说明【转】

来源:九壹网
JAXB解析xml的注解说明【转】

1.将 xml ⽂件中的各个节点和属性信息创建对应的Java模型

2.在Java模型中的创建与 xml ⽂件对应的节点和属性需要⽤注解来表⽰@XmlRootElement 将⼀个Java类映射为⼀段XML的根节点参数:

name 定义这个根节点的名称

namespace 定义这个根节点命名空间

@XmlAccessorType 定义映射这个类中的何种类型需要映射到XML。可接收四个参数,分别是:XmlAccessType.PROPERTY:映射这个类中的属性(get/set⽅法)到XML

XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)XmlAccessType.NONE:不映射

@XmlElement 指定⼀个字段或get/set⽅法映射到XML的节点。如,当⼀个类的XmlAccessorType 被标注为PROPERTY时,在某⼀个没有get/set⽅法的字段上标注此注解,即可将该字段映射到XML。参数:

defaultValue 指定节点默认值name 指定节点名称

namespace 指定节点命名空间

required 是否必须(默认为false)

nillable 该字段是否包含 nillable=\"true\" 属性(默认为false) type 定义该字段或属性的关联类型

@XmlAttribute 指定⼀个字段或get/set⽅法映射到XML的属性。参数:

name 指定属性名称

namespace 指定属性命名空间

required 是否必须(默认为false)

@XmlTransient 定义某⼀字段或属性不需要被映射为XML。

如,当⼀个类的XmlAccessorType 被标注为PROPERTY时,在某⼀get/set⽅法的字段上标注此注解,那么该属性则不会被映射。@XmlType 定义映射的⼀些相关规则参数:

propOrder 指定映射XML时的节点顺序

factoryClass 指定UnMarshal时⽣成映射类实例所需的⼯⼚类,默认为这个类本⾝factoryMethod 指定⼯⼚类的⼯⼚⽅法

name 定义XML Schema中type的名称 namespace 指定Schema中的命名空间

@XmlElementWrapper 为数组元素或集合元素定义⼀个⽗节点。如,类中有⼀元素为List items,若不加此注解,该元素将被映射为 ... ...

这种形式,此注解可将这个元素进⾏包装,如: @XmlElementWrapper(name=\"items\") @XmlElement(name=\"item\") public List items;

将会⽣成这样的XML样式:

... ...

@XmlJavaTypeAdapter ⾃定义某⼀字段或属性映射到XML的适配器。

如,类中包含⼀个接⼝,我们可以定义⼀个适配器(继承⾃ javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接⼝如何映射到XML。

@XmlSchema 配置整个包的namespace,这个注解需放在package-info.java⽂件中 ...

这种形式,此注解可将这个元素进⾏包装,如: @XmlElementWrapper(name=\"items\") @XmlElement(name=\"item\") public List items;

将会⽣成这样的XML样式:

... ...

@XmlJavaTypeAdapter ⾃定义某⼀字段或属性映射到XML的适配器。

如,类中包含⼀个接⼝,我们可以定义⼀个适配器(继承⾃ javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接⼝如何映射到XML。

@XmlSchema 配置整个包的namespace,这个注解需放在package-info.java⽂件中 ...

@XmlJavaTypeAdapter ⾃定义某⼀字段或属性映射到XML的适配器。

如,类中包含⼀个接⼝,我们可以定义⼀个适配器(继承⾃ javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接⼝如何映射到XML。

@XmlSchema 配置整个包的namespace,这个注解需放在package-info.java⽂件中3.⽰例代码//Java Entity

@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name = \"automation\")public class JavaBean{

@XmlAttribute(name = \"service\") private String serviceName;

@XmlElementWrapper(name = \"rules\") @XmlElement(name = \"rule\") private List rules;

@XmlElementWrapper(name = \"actions\") @XmlElement(name = \"action\") private List actions;

public List getRules() {

return rules; }

public String getServiceName() {

return serviceName; }

public void setServiceName(String serviceName) {

this.serviceName = serviceName; }

public void setRules(List rules) {

this.rules = rules; }

public List getActions() {

return actions; }

public void setActions(List actions) {

this.actions = actions; }}

//ObjectFactory@XmlRegistry

public class ObjectFactory{

private final static QName _Configurations_SCALERULE_QNAME = new QName( \"http://www.huawei.com/cloudCube/cloudview\

public ObjectFactory() { }

public Action createAction() {

return new Action(); }

public ActionProperty createActionProperty() {

return new ActionProperty(); }

public JavaBean createJavaBean() {

return new JavaBean(); }

public Dimension createDimension() {

return new Dimension(); }

public Rule createRule() {

return new Rule(); } }

//解析

public static Object unmarshal(InputStream input, String classPath, String schemaResPath, ClassLoader classLoader) throws JAXBException, SAXException {

JAXBContext jaxbContext = JAXBContext.newInstance(classPath, classLoader);

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

if (schemaResPath != null && !schemaResPath.isEmpty()) {

URL schemaURL = classLoader.getResource(schemaResPath); Schema schema = schemaFactory.newSchema(schemaURL); unmarshaller.setSchema(schema); }

Object obj = unmarshaller.unmarshal(input); return obj; }//转换

public static Object convertor(String fi) throws Exception {

ClassLoader classLoader = ObjectFactory.class.getClassLoader(); String contextPath = ObjectFactory.class.getPackage().getName(); File file = new File(fi); if (!file.isDirectory()) {

InputStream input = new FileInputStream(file);

JavaBean bean = (JavaBean) XMLMarshallUtil.unmarshal(input, contextPath, null,

classLoader); return bean; } else {

File[] fs = file.listFiles();

List list = new ArrayList(); for (int i = 0; i < fs.length; i++) {

InputStream input = new FileInputStream(fs[i]);

JavaBean bean = (JavaBean) XMLMarshallUtil.unmarshal(input, contextPath, null,

classLoader); list.add(bean); }

return list; } }

//main函数

public static void main(String[] args) throws Exception {

Object obj = Test.convertor(\"bin/conf/\"); if (obj instanceof JavaBean) {

JavaBean bean = (JavaBean) obj;

System.out.println(bean.getServiceName()); }

if (obj instanceof List) {

List list = (List) obj; for (JavaBean bean : list) {

System.out.println(bean.getActions().get(1).getActionName()); } } }

4.解析过程中出现异常

1)解析⽂件中JAXBContext.newInstance(Service.class)创建新的实例错误,正确的是 (ServiceMetric.class)javax.xml.bind.UnmarshalException- with linked exception:

[java.io.IOException: Stream closed]2)使⽤ StreamSource 类出现的异常

StreamSource streamSource = new StreamSource(read); root = (Service) um.unmarshal(streamSource);javax.xml.bind.UnmarshalException- with linked exception:

[org.xml.sax.SAXParseException: Premature end of file.]

3)解析过程中返回的对象中有引⽤类型的属性,需要将⾥⾯所有的引⽤类型属性,全都实例化(ObjectFactory作⽤)。

Exception in thread \"main\" javax.xml.bind.JAXBException: \"bean.javaBean\" doesnt contain ObjectFactory.class or jaxb.index

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务