当前位置: 首页 > 面试题库 >

用JAXB指定根和子节点

薛晨
2023-03-14
问题内容

停留在JAXB我将如何重构MyNote以使其符合:

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

这是很好但不是有效的,我的理解。电流输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyNotes>
    <Note>
        <note>XY3Z1RGEO9W79LALCS</note>
        <to>LJAY9RNMUGGENGNND9</to>
        <from>GOVSHVZ3GJWC864L7X</from>
        <heading>EX6LGVE5LGY4A6B9SK</heading>
        <body>L95WYQNMEU1MFDRBG4</body>
    </Note>
</MyNotes>

太平坦了,而不是像例子一样嵌套。

我相信,如果我使用的是正确的术语,这将构成noteroot元素,其他元素将成为该元素的children节点note

MyNote类:

package net.bounceme.dur.jaxb.hello.world;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder = {"note", "to", "from", "heading", "body"})
@XmlRootElement(name = "note")
public class MyNote {

    private String note;
    private String to;
    private String from;
    private String heading;
    private String body;

    public String getNote() {
        return note;
    }

    @XmlElement(name = "note")
    public void setNote(String note) {
        this.note = note;
    }

    public String getTo() {
        return to;
    }

    @XmlElement(name = "to")
    public void setTo(String to) {
        this.to = to;
    }

    public String getFrom() {
        return from;
    }

    @XmlElement(name = "from")
    public void setFrom(String from) {
        this.from = from;
    }

    public String getHeading() {
        return heading;
    }

    @XmlElement(name = "heading")
    public void setHeading(String heading) {
        this.heading = heading;
    }

    public String getBody() {
        return body;
    }

    @XmlElement(name = "body")
    public void setBody(String body) {
        this.body = body;
    }

    @Override
    public String toString() {
        return note + to + from + heading + body;
    }

}

MyNotes类:

package net.bounceme.dur.jaxb.hello.world;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "MyNotes")
public class MyNotes {

    private static final Logger LOG = Logger.getLogger(MyNotes.class.getName());

    private List<MyNote> myNotes = new ArrayList<>();

    public MyNotes() {
    }

    public List<MyNote> getMyNotes() {
        LOG.info(myNotes.toString());
        return myNotes;
    }

    @XmlElement(name = "Note")
    public void setMyNotes(List<MyNote> myNotes) {
        LOG.info(myNotes.toString());
        this.myNotes = myNotes;
    }

    public void add(MyNote myNote) {
        LOG.info(myNote.toString());
        myNotes.add(myNote);
    }

    @Override
    public String toString() {
        StringBuffer str = new StringBuffer();
        for (MyNote note : this.myNotes) {
            str.append(note.toString());
        }
        return str.toString();
    }

}

锻炼的MyNoteMyNotes类:

    public MyNotes unmarshallMyNotesFromFile(URI uri) throws Exception {
        File file = new File(uri);
        JAXBContext jaxbContext = JAXBContext.newInstance(MyNotes.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        MyNotes myNotes = (MyNotes) jaxbUnmarshaller.unmarshal(file);
        return myNotes;
    }

    public void marshallMyNotesAndWriteToFile(MyNotes notes, URI uri) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(MyNotes.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        jaxbMarshaller.marshal(notes, new File(uri));
        jaxbMarshaller.marshal(notes, System.out);
    }

我期待抓住这个xml通过网络;
首先需要将结构与示例匹配。


问题答案:

你很亲密
您需要更改在MyNotes类中为myNotes命名xmlElement的方式。同样,MyNote本身不应该具有注释字段(根据您所需的xml)。您编辑的类如下所示(为方便起见,我也删除了日志记录语句):

@XmlType(propOrder = { "to", "from", "heading", "body"})
@XmlRootElement(name = "note")
public class MyNote {

    private String to;
    private String from;
    private String heading;
    private String body;

    public String getTo() {
        return to;
    }

    @XmlElement(name = "to")
    public void setTo(String to) {
        this.to = to;
    }

    public String getFrom() {
        return from;
    }

    @XmlElement(name = "from")
    public void setFrom(String from) {
        this.from = from;
    }

    public String getHeading() {
        return heading;
    }

    @XmlElement(name = "heading")
    public void setHeading(String heading) {
        this.heading = heading;
    }

    public String getBody() {
        return body;
    }

    @XmlElement(name = "body")
    public void setBody(String body) {
        this.body = body;
    }

    @Override
    public String toString() {
        return  to + from + heading + body;
    }

}

和MyNotes:

@XmlRootElement(name = "MyNotes")
public class MyNotes {

    private List<MyNote> myNotes = new ArrayList<>();

    public MyNotes() {
    }

    public List<MyNote> getMyNotes() {
        return myNotes;
    }

    @XmlElement(name = "note")
    public void setMyNotes(List<MyNote> myNotes) {
        this.myNotes = myNotes;
    }

    public void add(MyNote myNote) {
        myNotes.add(myNote);
    }

    @Override
    public String toString() {
        StringBuffer str = new StringBuffer();
        for (MyNote note : this.myNotes) {
            str.append(note.toString());
        }
        return str.toString();
    }

}


 类似资料:
  • 问题很简单:从这里: 我必须分析一下: 这意味着每个属性都应该成为一个新的根节点。但对我来说,最困难的是我不能从“属性”中设置“属性”值作为对象节点名称。 这对我来说是个挑战。我可以在根节点中设置新节点。已经从“attributes”中获得了一个映射,然后尝试使用forEach对它们进行迭代,以便将结果放入一个节点中,但如图所示,我必须使用“property”将其设置为对象名称的键,然后获取值并设

  • 问题内容: 我正在使用SLSB和JAX-WS批注创建一个简单的SOAP Web服务。我要传递的对象是从OGC模式生成的JAXB,这要感谢java.net上的OGC项目。我遇到的一种特定方法(导致部署失败)是一种情况,其中请求对象(GetResult)的字段(eventTime)与请求对象位于不同的包中。此类型的ObjectFactory不同,在编组/解组时存在问题。 我收到的部分错误: 在标准SE

  • 如果是子节点'1',那么不是子节点'2'吗?

  • 我目前正在为XML文档流开发一个自定义管道组件,其中根节点和该根节点的第一个子节点需要剥离,只剩下第二个子节点(现在是新的根节点)。 我正在使用XDocumt作为XML文档的容器类。我写了一些代码,获取第二个子节点,并创建一个新的XML文档,将该节点作为根节点,从而从图片中删除两个不需要的节点。 但是当我在Biztalk中测试这个设置时,我只得到一个空文档作为响应。它似乎创建了一个空的XML文档,

  • 当我们进行BST时,我明白一个主要的关键点是左孩子必须小于右孩子。当我们创建一个BST并有一个根节点时,当您在该根节点的左侧遍历并到达其右子节点时,右子节点是否也大于根节点? 如果我们在根节点的右侧遍历,也是如此。如果我们在根节点的右侧遍历,我们会遇到这样一种情况吗,即我们击中了一个小于根节点值的左子节点?

  • 我有一个如下所示的JTree结构。我有图标,每当节点有子节点时就会出现,这是正常工作的。 我的问题是我需要隐藏根节点。当我隐藏根节点时,不会显示MainTop1和MainTop2节点的图标,尽管它们有子节点。为了隐藏根节点,我使用“setrootvisible(false)”。 此外,当根节点隐藏时,Topic1和Topic节点的图标将正确显示。 有人知道如何在隐藏ROOT时显示MainTop1和