Java JAXB XML解析AWS S3 Bucket XML时不解析任何内容
我目前正在尝试使用JAXB库解析AWS S3 Bucket的XML输出。我没有收到任何错误,尽管ListBucketObject没有得到任何内容。我尝试过向JavaPOJO模型添加XmlAccessorTypes,但收效甚微。有什么建议吗 XML Owner.javaJava JAXB XML解析AWS S3 Bucket XML时不解析任何内容,java,xml,amazon-s3,jaxb,Java,Xml,Amazon S3,Jaxb,我目前正在尝试使用JAXB库解析AWS S3 Bucket的XML输出。我没有收到任何错误,尽管ListBucketObject没有得到任何内容。我尝试过向JavaPOJO模型添加XmlAccessorTypes,但收效甚微。有什么建议吗 XML Owner.java package parseXML; public class Owner { private String ID; private String DisplayName; public String g
package parseXML;
public class Owner {
private String ID;
private String DisplayName;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getDisplayName() {
return DisplayName;
}
public void setDisplayName(String displayName) {
DisplayName = displayName;
}
}
以下是几点观察:
ListBucketResult
类的根元素上声明名称空间:
@XmlRootElement(name = "ListBucketResult", namespace = "http://s3.amazonaws.com/doc/2006-03-01/")
改用这个:
@XmlRootElement(name = "ListBucketResult")
对于名称空间,在package info.java
文件中处理它。这是在parseXML
包中创建的,与类的创建方式相同,但包含以下内容:
@XmlSchema(
namespace = "http://s3.amazonaws.com/doc/2006-03-01/",
elementFormDefault = XmlNsForm.QUALIFIED)
package parseXML;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNsForm;
这确保了XML文件中的所有元素都是限定的,而不仅仅是那些与ListBucketResult
类中的字段相关的元素
getter、setter和字段名
我认为您命名Java字段的方式给getter/setter带来了问题,因为它们不符合JavaBeans命名约定
示例:在您的列表BucketResult
中,您有以下内容:
private List<Contents> Contents;
public List<Contents> getContents() {
return Contents;
}
public void setContents(List<Contents> contents) {
Contents = contents;
}
然后,在Contents
类中,我必须执行类似的操作-例如(同样,忽略除key
之外的所有字段):
如果对类中的其余字段重复此过程,则将拥有完全填充的Java对象
结果
通过仅进行上述更改,我的驱动程序代码(与您的代码相同)现在打印出以下结果:
202008281741/
202008281741/161_209_2_0_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_1_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_2_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_3_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
test/
test/33.txt
通过对所有剩余字段名应用相同的更改,您将能够处理完整的XML文件。以下几点:
ListBucketResult
类的根元素上声明名称空间:
@XmlRootElement(name = "ListBucketResult", namespace = "http://s3.amazonaws.com/doc/2006-03-01/")
改用这个:
@XmlRootElement(name = "ListBucketResult")
对于名称空间,在package info.java
文件中处理它。这是在parseXML
包中创建的,与类的创建方式相同,但包含以下内容:
@XmlSchema(
namespace = "http://s3.amazonaws.com/doc/2006-03-01/",
elementFormDefault = XmlNsForm.QUALIFIED)
package parseXML;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNsForm;
这确保了XML文件中的所有元素都是限定的,而不仅仅是那些与ListBucketResult
类中的字段相关的元素
getter、setter和字段名
我认为您命名Java字段的方式给getter/setter带来了问题,因为它们不符合JavaBeans命名约定
示例:在您的列表BucketResult
中,您有以下内容:
private List<Contents> Contents;
public List<Contents> getContents() {
return Contents;
}
public void setContents(List<Contents> contents) {
Contents = contents;
}
然后,在Contents
类中,我必须执行类似的操作-例如(同样,忽略除key
之外的所有字段):
如果对类中的其余字段重复此过程,则将拥有完全填充的Java对象
结果
通过仅进行上述更改,我的驱动程序代码(与您的代码相同)现在打印出以下结果:
202008281741/
202008281741/161_209_2_0_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_1_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_2_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_3_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
test/
test/33.txt
通过对所有剩余字段名应用相同的更改,您将能够处理完整的XML文件
202008281741/
202008281741/161_209_2_0_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_1_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_2_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
202008281741/161_209_2_3_255_1_97_InitializedAnalysis_219_0m(AMSL)_0.000000_-1_-1.000000_-1.000000
test/
test/33.txt