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

如何在java中指定对象以生成具有多个本地名称空间的XML,java,xml,namespaces,jaxb,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&l

我需要使用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>
信息内容:

@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);
    }
private static void writeToSysOut(消息obj){
字符串结果=null;
试一试{
JAXBContext context=JAXBContext.newInstance(Message.class);
Marshaller m=context.createMarshaller();
m、 setProperty(Marshaller.JAXB_格式的_输出,Boolean.TRUE);
StringWriter编写器=新的StringWriter();
m、 marshal(新的JAXBElement(新的QName(“message”)、message.class、obj)、writer;
结果=writer.toString();
}捕获(JAXBEException e){
系统输出打印ln(e);
}
系统输出打印项次(结果);
}
我得到了这个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>

TestXML
123456789
某个名字
某个地址

如何更改anotation以获取在特定属性(如示例xml)中定义了名称空间的xml。我需要有这种特定的格式,因为如果XML不是这种特定的格式,我使用的其他部分就无法处理它。感谢

这两个元素已经在根级别(message)xmlns:xsd=”“xmlns:xsi=”“中定义,因此您不必添加子元素。您可以像这样添加一个名称空间<代码>@XmlRootElement(name=“messagecontent”,命名空间=”http://mynamespace.org/messagecontent)公共类消息内容{因此,对相应的类执行上述操作可能会解决问题。感谢您的回答,不幸的是,这没有帮助,或者是我做得不对。我编辑了我的帖子,添加了所有带有anotations的对象以及我现在得到的xml。在我看来,您试图实现的目标无法用普通jaxb实现。子元素完成了@SarfarazKhan所说的是正确的。此外:您发布的XML似乎无效。名称空间(nsX)从未被引用。
<?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>