【问题标题】:Need help in formatting JAXB output在格式化 JAXB 输出方面需要帮助
【发布时间】:2012-05-10 12:35:16
【问题描述】:

我有一些对象,比如说两个,A 和 B。这些对象来自同一个类。我需要使用 JAXB 编组这些对象,输出 XML 应该是这种形式:

<Root>
    <A>
        <ID> an id </ID>
    </A>
    <B>
        <ID> an id </ID>
    </B>
</Root>

<!-- Then all A and B attributes must be listed !-->
<A>
    <ID> an id </ID>
    <attribute1> value </attribute1>
    <attribute2> value </attribute2>
</A>
<B>
    <ID> an id </ID>
    <attribute1> value </attribute1>
    <attribute2> value </attribute2>
</B>

如何在 JAXB 中生成这种格式?任何帮助表示赞赏。

更新: 更具体地说,假设我们有这样的 Human 类:

@XmlRootElement
public class Human {
    private String name;
    private int age;
    private Integer nationalID;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Integer getNationalID() {
        return nationalID;
    }

    public void setNationalID(Integer nationalID) {
        this.nationalID = nationalID;
    }
}

我们的主要课程是:

public class Main3 {

    public static void main(String[] args) throws JAXBException {
        Human human1 = new Human();
        human1.setName("John");
        human1.setAge(24);
        human1.setNationalID(Integer.valueOf(123456789));

        JAXBContext context = JAXBContext.newInstance(Human.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        StringWriter stringWriter = new StringWriter();

        m.marshal(human1, stringWriter);

        System.out.println(stringWriter.toString());
    }

}

那么输出将是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<human>
    <age>24</age>
    <name>John</name>
    <nationalID>123456789</nationalID>
</human>

现在我需要这样的输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<human>
    <nationalID>123456789</nationalID>
</human>
<human>
    <nationalID>123456789</nationalID>
    <age>24</age>
    <name>John</name>
</human>

这将帮助我绘制一个没有属性(仅按 ID)的 XML 对象树,然后是树下的所有定义。这可以使用 JAXB 或任何其他实现吗?

【问题讨论】:

    标签: java xml jaxb2 xml-formatting


    【解决方案1】:

    试试这个:

    import java.io.StringWriter;
    import javax.xml.bind.Marshaller;
    
    ...
    
    Object requestObject = ...  // This is the object that needs to be printed with indentation
    Marshaller marshaller = ...
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    StringWriter stringWriter = new StringWriter();
    marshaller.marshal(requestObject, stringWriter);
    
    System.out.println(stringWriter.toString());
    

    【讨论】:

    • 不幸的是,这不是我需要的,这将生成一个 XML,每个节点都包含它的属性。我更清楚地向我更新了这个问题(我的错,对不起)。
    • 我认为没有解决方案可以解决您想要使用 jaxb 执行的操作,因为它对命名过于严格。您打算如何使用 xml,也许您可​​以使用其他解析器生成它,或者在最坏的情况下您可以创建自己的解析器来完成此任务。我已尝试创建您所期望的内容,但只有使用额外的标签和/或命名空间才能实现。
    • 非常感谢您的回复。你能告诉我你使用了哪些额外的标签吗?我可以使用我需要的任何标签。另外,您认为还有哪些其他解析器可以帮助我解决这个问题?该解决方案不必严格命名,但它应该只使用 ID 创建一个对象树,并且对象的属性应该在树的下方,这是唯一重要的事情。
    【解决方案2】:
    package com.namasoft.dms.gui.common.utilities;
    
    import java.io.StringWriter;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.annotation.XmlAccessorOrder;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlID;
    import javax.xml.bind.annotation.XmlIDREF;
    import javax.xml.bind.annotation.XmlRootElement;
    
    public class JAXB
    {
    
        public static class Human
        {
    
            @XmlID
            String id;
            @XmlElement
            String name;
            @XmlElement
            int age;
    
            public Human()
            {
            }
    
            public Human(String name)
            {
                this.id = this.name = name;
                age = new Random().nextInt();
            }
        }
    
        @XmlRootElement
        public static class HumansList
        {
            @XmlElementWrapper(name = "humanObjects")
            @XmlElement(name = "human")
            List<Human> humanObjects = new ArrayList<>();
    
            @XmlIDREF
            @XmlElementWrapper(name = "humanIds")
            @XmlElement(name = "id")
            List<Human> humanIds = new ArrayList<>();
    
            void addHuman(Human human)
            {
                humanObjects.add(human);
                humanIds.add(human);
            }
        }
    
        public static void main(String[] args) throws JAXBException
        {
            HumansList list = new HumansList();
            Human parent1 = new Human("parent1");
            list.addHuman(parent1);
            Human child11 = new Human("child11");
            list.addHuman(child11);
            Human child12 = new Human("child12");
            list.addHuman(child12);
    
            Human parent2 = new Human("parent2");
            list.addHuman(parent2);
            Human child21 = new Human("child21");
            list.addHuman(child21);
            Human child22 = new Human("child22");
            list.addHuman(child22);
    
            JAXBContext context = JAXBContext.newInstance(HumansList.class);
            Marshaller m = context.createMarshaller();
            StringWriter xml = new StringWriter();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    
            m.marshal(list, xml);
            System.out.println(xml);
        }
    }
    

    输出将是

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <humansList>
        <humanObjects>
            <human>
                <id>parent1</id>
                <name>parent1</name>
                <age>-486071665</age>
            </human>
            <human>
                <id>child11</id>
                <name>child11</name>
                <age>920318383</age>
            </human>
            <human>
                <id>child12</id>
                <name>child12</name>
                <age>-1355111983</age>
            </human>
            <human>
                <id>parent2</id>
                <name>parent2</name>
                <age>-314154051</age>
            </human>
            <human>
                <id>child21</id>
                <name>child21</name>
                <age>983544381</age>
            </human>
            <human>
                <id>child22</id>
                <name>child22</name>
                <age>748252616</age>
            </human>
        </humanObjects>
        <humanIds>
            <id>parent1</id>
            <id>child11</id>
            <id>child12</id>
            <id>parent2</id>
            <id>child21</id>
            <id>child22</id>
        </humanIds>
    </humansList>
    

    【讨论】:

    • 给你的道具,先生。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2021-08-26
    相关资源
    最近更新 更多