JAXB - Hello World with Namespace

如果元素带有命名空间,那么处理方式与 JAXB - Hello World 会略有不同。

1. XML Schema:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:ns0="http://www.huey.com/hello/beans/" targetNamespace="http://www.huey.com/hello/beans/" jxb:version="2.0">
    <xsd:element name="Greetings" type="ns0:GreetingListType"/>
    <xsd:complexType name="GreetingListType">
        <xsd:sequence>
            <xsd:element name="Greeting" type="ns0:GreetingType" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="GreetingType">
        <xsd:sequence>
            <xsd:element name="Text" type="xsd:string"/>
        </xsd:sequence>
        <xsd:attribute name="language" type="xsd:language"/>
    </xsd:complexType>
</xsd:schema>

2. 编译 schema 生成 Java 类:

xjc hello.xsd    // 取默认的包路径,根据命名空间生成

3. 修改生成的 GreetingListType.java 文件,添加 @XmlRootElement,指定根元素的名称和命名空间:

package com.huey.hello.beans;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GreetingListType", propOrder = {
    "greeting"
})
@XmlRootElement(namespace = "http://www.huey.com/hello/beans/", name = "Greetings")
public class GreetingListType {

    @XmlElement(name = "Greeting", required = true)
    protected List<GreetingType> greeting;

    public List<GreetingType> getGreeting() {
        if (greeting == null) {
            greeting = new ArrayList<GreetingType>();
        }
        return this.greeting;
    }

}

4. marshal:

public class JaxbUtils {

    // ...

    public static <T> String marshal(T obj) {
        StringWriter writer = new StringWriter();
        try {

            JAXBContext jc = JAXBContext.newInstance(obj.getClass());
            Marshaller m = jc.createMarshaller();
            m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
            m.marshal(obj, writer);
        } catch (JAXBException jbe) {
            // ...
        }
        return writer.toString();
    }
}

5. 测试 JaxbUtils.marshal 方法:

public class JaxbUtilsTest {
    @Test
    public void testMarshal() throws Exception {
        GreetingListType glt = new GreetingListType();
        GreetingType gt1 = new GreetingType();
        gt1.setLanguage("en");
        gt1.setText("Hello world");
        glt.getGreeting().add(gt1);
        GreetingType gt2 = new GreetingType();
        gt2.setLanguage("fr");
        gt2.setText("Bonjour, madame");
        glt.getGreeting().add(gt2);

        System.out.println(JaxbUtils.marshal(glt));
    }
}

6. JaxbUtils.marshal 测试输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Greetings xmlns:ns2="http://www.huey.com/hello/beans/">
    <Greeting language="en">
        <Text>Hello world</Text>
    </Greeting>
    <Greeting language="fr">
        <Text>Bonjour, madame</Text>
    </Greeting>
</ns2:Greetings>

7. unmarshal:

public class JaxbUtils {

    // ...

    public static <T> T unmarshal(Class<T> docClass, InputStream inputStream) throws JAXBException {
        JAXBContext jc = JAXBContext.newInstance(docClass);
        Unmarshaller u = jc.createUnmarshaller();
        T obj = (T) u.unmarshal(inputStream);
        return obj;
    }
}

8. 以 JaxbUtils.marshal 的测试输出作为 JaxbUtils.unmarshal 的输入做测试:

public class JaxbUtilsTest {
    @Test
    public void testUnmarshal() throws Exception {
        String path = "/files/hello.xml";
        InputStream in = JaxbUtilsTest.class.getResourceAsStream(path);
        try {
            GreetingListType greetingList = JaxbUtils.unmarshal(GreetingListType.class, in);
            List<GreetingType> greetings = greetingList.getGreeting();
            for (GreetingType greeting : greetings) {
                System.out.println(greeting.getLanguage() + ": " + greeting.getText());
            }
        } catch (JAXBException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(in);
        }
    }
}

9. JaxbUtils.unmarshal 测试输出:

fr: Bonjour, madame
en: Hey, you

Namespace

时间: 2024-10-13 22:57:03

JAXB - Hello World with Namespace的相关文章

Java操作XML的JAXB工具

在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上的资料,简单说明一下java操作xml的一些东西. 1.先定义一个XML Schema文件.比如: [html] view plain copy print? <?xml version="1.0" encoding="UTF-8" standalone=&quo

JAXB最佳实践

JAXB主要用来实现对象和XML之间的序列化和反序列化. 本文主要总结JAXB基本使用方法和注意事项! 通过下文的XML示例内容进行JAXB的简单实践 <?xml version="1.0" encoding="UTF-8"?> <Provinces> <Province id="B001"> <name>北京</name> <code>30000</code>

CXF之&quot;@XmlType.name 和 @XmlType.namespace 为类分配不同的名称&quot;错误

CXF 的 wsdl2java.bat 生产的代码,拷贝到目录,进行调研 web service接口时,抛出错误: Exception in thread "main" javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:347)

JAXB注解

JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版本JAX-WS2.1,其底层支持就是JAXB. JAXB 可以实现Java对象与XML的相互转换,在JAXB中,将一个Java对象转换为XML的过程称之为Marshal,将XML转换为Java对象的过程称之为UnMarshal.我们可以通过在 Java 类中标注注解的方式将一个Java对象绑定到一段

JAVA开发Webservice——JAXB

JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版本JAX-WS2.1,其底层支持就是JAXB. JAXB 可以实现Java对象与XML的相互转换,在JAXB中,将一个Java对象转换为XML的过程称之为Marshal,将XML转换为Java对象的过程称之为UnMarshal.我们可以通过在 Java 类中标注注解的方式将一个Java对象绑定到一段

XML 注解方式 (Jaxb的使用)

一.Jaxb处理java对象和xml之间转换常用的annotation有: @XmlType @XmlElement @XmlRootElement @XmlAttribute @XmlAccessorType @XmlAccessorOrder @XmlTransient @XmlJavaTypeAdapter 二.常用annotation使用说明 @XmlType @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用.它有三个属

Java操作XML的工具:JAXB

JavaArchitecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档.从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数. 这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程

JAXB 注解

JAXB(Java API for XML Binding),它提供了一个便捷的方式高速Java对象XML转变.于JAX-WS(Java的WebService规范之中的一个)中,JDK1.6 自带的版本号JAX-WS2.1.其底层支持就是JAXB. JAXB 能够实现Java对象与XML的相互转换.在JAXB中,将一个Java对象转换为XML的过程称之为Marshal.将XML转换为Java对象的过程称之为UnMarshal.我们能够通过在 Java 类中标注注解的方式将一个Java对象绑定到一

使用JAXB实现JAVA对象和XML字符串的互相转换实例

测试类: package com.yanek.test; import java.util.ArrayList; import java.util.List; import com.yanek.test.JaxbUtil.CollectionWrapper; public class Test { /** * @param args */ public static void main(String[] args) { //创建java对象 Hotel hotel=new Hotel(); ho