我无法使用 Jaxb 访问命名空间 <str name="footprint'>

I can't access to the namespace <str name="footprint'> with Jaxb

一切都在标题中。我是 Jaxb 和 XML 的新手。 我可以访问其他命名空间,例如

等...但是带有 的命名空间,我不能。 你能帮助我吗?我有点迷路了。 我只有空数据,找不到方法

代码如下:

供稿 class:

@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
  public class Feed {

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

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

}

条目Class:

@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:

first part

second part

谢谢!

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

<str name="footprint">

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

所以注释需要是:

@XmlAttribute(name="name")

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

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

<feed>
  <entry>
    <str name="footprint">Some very long string of data in here.</str>
    <str name="format">SAFE</str>
  </entry>
</feed>

...我们有以下三个相关的classes:

提要class

@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;
    }

}

条目class:

@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;
    }

}

海峡class:

@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;
    }

}

然后,解组看起来像这样:

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)。