首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我无法使用Jaxb访问名称空间<str name=“内存access =‘>

我无法使用Jaxb访问名称空间<str name=“内存access =‘>
EN

Stack Overflow用户
提问于 2020-04-03 13:01:52
回答 1查看 104关注 0票数 0

一切都在标题里。我是刚接触Jaxb和XML的。我可以访问其他名称空间,如< summary>或< id>等.但是使用< str name=“>或< int name=”>的名称空间,我不能。您能帮我吗?我有点迷路了。我只有空数据,我找不到路。

下面是代码:

饲料类:

代码语言:javascript
复制
@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
  public class Feed {

    @XmlElement(name = "entry")
    private List<Entry> entries;

    public List<Entry> getEntries() {
        return this.entries;
    }

}

入职班:

代码语言:javascript
复制
@XmlRootElement(name = "entry")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
    //@XmlElement(name = "footprint")//<str name="footprint"> dont work.
    //@XmlAttribute(name="footprint")//dont work
    //@XmlValue//dont work
    private String footprint;

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

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

    public Entry() {}

    public String getCoordinates() {
        return footprint;
    }

    public String getId() {
        return id;
    }

    public String getSize() {
        return size;
    }

    public void setCoordinates(String footprint) {
        this.footprint=footprint;
    }
    public void setSize(String size) {
        this.size=size;
    }
    public void setId(String id) {
        this.id=id;
    }

}

XML:

第一部分

第二部分

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-03 15:34:17

您可以使用@XmlAttribute注释-因为您正在访问的数据是属性。属性有一个名称和一个值-您的示例是:

代码语言:javascript
复制
<str name="footprint">

在本例中,属性的名称为name,其值为"footprint"

因此,注释需要如下:

代码语言:javascript
复制
@XmlAttribute(name="name")

但是,由于XML包含多个name属性,所以JAXB将将每个属性创建为一个单独的对象--名称-值对列表。

对于以下您的XML的精简表示形式.

代码语言:javascript
复制
<feed>
  <entry>
    <str name="footprint">Some very long string of data in here.</str>
    <str name="format">SAFE</str>
  </entry>
</feed>

..。我们有以下三个相关的课程:

提要类

代码语言:javascript
复制
@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
public class FeedType {

    @XmlElement(required = true)
    protected EntryType entry;

    public EntryType getEntry() {
        return entry;
    }

    public void setEntry(EntryType value) {
        this.entry = value;
    }

}

条目类:

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entry")
public class EntryType {

    @XmlElement(required = true)
    protected List<StrType> str;

    public List<StrType> getStr() {
        if (str == null) {
            str = new ArrayList<>();
        }
        return this.str;
    }

}

Str类:

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "str")
public class StrType {

    @XmlAttribute(name = "name")
    private String name;

    @XmlValue
    private String data;

    public String getName() {
        return name;
    }

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

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

}

然后,解组如下所示:

代码语言:javascript
复制
JAXBContext jc = JAXBContext.newInstance(FeedType.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("path/to/your/sample.xml");
FeedType feed = (FeedType) unmarshaller.unmarshal(xml);

这将创建一个StrType对象列表,如下所示:

这显然是一个不同的结构,你想要创造在你的问题。但是所有的数据都会被捕获,并根据请求使用jaxb。

可能有其他方法可以直接支持您的bean布局,例如,StAX方法,当XML被逐标记扫描时,您会填充每个bean。这本身有一些明显的缺点(例如,手动bean种群)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61012517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档