我无法使用 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)。
一切都在标题中。我是 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)。