如何在java中分配对象以生成具有多个本地名称空间的XML

时间:2015-06-21 08:15:04

标签: java xml namespaces jaxb

我需要使用特定格式的JAXB从java对象生成XML:

<message xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://mynamespace.org/message">
    <header>
        <name>Message</name>
        <id>randomUUID</id>
    </header>
    <body>
        <messagecontent xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xmlns="http://mynamespace.org/messagecontent">
            <object id="randomUUID" type="form">
                <formular xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                          xmlns="http://mynamespace.org/formular">
                          <name>Username</name>
                          <address>UserAddress</address>
                </formular>
            <object>
        </messagecontent>
    </body>
</message>

对于这个类型的xml文档,我在java中有3个对象:

消息:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "message", propOrder = {
    "header",
    "body"
})
@XmlRootElement(name = "message",namespace="http://mynamespace.org/message")
public class Message {

    @XmlElement(name = "header")
    private Message.Header header;
    @XmlElement(name = "body")
    private Message.Body body;

    public Header getHeader() {
        return header;
    }

    public void setHeader(Header header) {
        this.header= header;
    }

    public Body getBody() {
        return body;
    }

    public void setBody(Body body) {
        this.body= body;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "header", propOrder = {
        "name",
        "id"
    })
    public static class Header {

        @XmlElement(name = "name")
        private String name;
        @XmlElement(name = "id")
        private String id;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }        
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "body", propOrder = {
        "msgContent",
    })
    public static class Body {

        @XmlElement(name = "messagecontent")
        private MessageContent msgContent;

        public MessageContent getMsgContent() {
            return msgContent;
        }

        public void setMsgContent(MessageContent msgContent) {
            this.msgContent = msgContent;
        } 
    }
}

在messageContent:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "messagecontent", propOrder = {
    "object"
})
@XmlRootElement(name = "messagecontent",namespace="http://mynamespace.org/messagecontent")
public class MessageContent{

    @XmlElement(name = "object")
    private Object object;

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "object", propOrder = {
        "id",
        "type",
        "formular"
    })
    public static class Object {

        @XmlAttribute(name = "id")
        private String id;
        @XmlAttribute(name = "type")
        private String type;
        @XmlElement(name = "formular")
        private Formular formular;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public Formular getFormular() {
            return formular;
        }

        public void setFormular(Formular formular) {
            this.formular = formular;
        }


    }
}

表现公式:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "formular", propOrder = {
    "name",
    "address"
})
@XmlRootElement(name = "formular",namespace="http://mynamespace.org/formular")
public class Formular {

    @XmlElement(name = "name")
    private String name;
    @XmlElement(name = "address")
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

使用此代码从此对象:

private static void writeToSysOut(Message obj) {
        String result = null;
        try {
            JAXBContext context = JAXBContext.newInstance(Message.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            StringWriter writer = new StringWriter();
            m.marshal(new JAXBElement<Message>(new QName("message"), Message.class, obj), writer);
            result = writer.toString();
        } catch (JAXBException e) {
            System.out.println(e);
        }
        System.out.println(result);
    }

我收到了这个XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns:ns2="http://mynamespace.org/formular" xmlns:ns4="http://mynamespace.org/message" xmlns:ns3="http://mynamespace.org/messagecontent">
    <header>
        <name>TestXML</name>
        <id>123456789</id>
    </header>
    <body>
        <messagecontent>
            <object id="23456789" type="msgType">
                <formular>
                    <name>Some name</name>
                    <address>Some address</address>
                </formular>
            </object>
        </messagecontent>
    </body>
</message>

如何更改anotation以获取具有在特定属性中定义的命名空间的xml,如示例XML中所示。我需要具有这种特定格式,因为我使用的其他部分如果不是这种特定格式,则不能处理XML。感谢

0 个答案:

没有答案
相关问题