Java JAXB如何将嵌套的xml元素解组为字符串?
我正在尝试将xml转换为Java类Java JAXB如何将嵌套的xml元素解组为字符串?,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我正在尝试将xml转换为Java类 @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "Request") public class Request { @XmlElement(name="UserName") private String username; @XmlElement(name="Password") private String password; @XmlElement(name="XMLPost"
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Request")
public class Request {
@XmlElement(name="UserName")
private String username;
@XmlElement(name="Password")
private String password;
@XmlElement(name="XMLPost")
private String xmlPost;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getXmlPost() {
return xmlPost;
}
public void setXmlPost(String xmlPost) {
this.xmlPost = xmlPost;
}}
这是我的背景
JAXBContext jc = JAXVContext.newInstance(Request.class, Report.class, Status.class);
StringReader reader = new StringReader(xml);
Unmarshaller unmarshaller = jc.createUnmarshaller();
下面是我如何一起使用它们
Request request = unmarshaller.unmarshal(reader);
在Request类中,xmlPost将包含Report的xml或Status的xml,因此我希望将其捕获到一个字符串中,以便尝试解组每个案例
Report类来自我无法控制的第三方请求。但是,当我尝试对请求进行解组时,如果XMLPost字段中有任何XML,它也会尝试对其进行解组,即使我已经指定它应该只是一个字符串。为什么我不能将XMLPost中的xml填充到字符串中
感谢您在advanced中提供的所有帮助。您可以使用cusom处理程序实现转换,请查看此帖子。我希望它能帮助您解决您的问题:您不能直接这样做,因为它不遵循XML规范。 定义时:
@XmlElement(name="XMLPost")
private String xmlPost;
这意味着,根据XML规范,JAXB希望使用简单类型元素XMLPost的XML作为xs:string。而不是作为另一个XML元素。
要在其中包含值,您的请求必须如下所示:
<Request>
<XMLPost>some string in it</XMLPost>
</Request>
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="Report" minOccurs="0">
<xs:complexType>
<xs:sequence>
<!-- ... Report type definition ... -->
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Status" minOccurs="0">
<xs:complexType>
<xs:sequence>
<!-- ... Status type definition ... -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
在这种情况下,您必须拥有用于报告和状态的JAXB类
然后,如果您的请求包含Report元素,那么
报告字段将包含它,并且状态将为空
或者,当请求具有状态时,状态字段将具有该状态,报告字段将为空
如果您需要报表和状态,而不需要使用字符串并分别对其进行解组,那么这种方法可能更合适。这取决于你和你需要如何处理这些元素
就XML模式而言,您做了什么:
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="XMLPost" type="xs:string">
</xs:sequence>
</xs:complexType>
</xs:element>
它对应于XSD:
<element name="XMLPost" type="xs:anyType" />
当然,当您处理请求时,您需要检查什么是xmlPost对象类,我真正要做的是创建一个xmlPost对象,其中包含可选的报告和状态字段。然后在解组后,您可以看到填充了哪一个 然而,要回答最初的问题,您应该使用XmlAdapter。下面是适配器的示例:
public class XmlPostStringAdapter extends XmlAdapter<XMLPost, String> {
@Override
public String unmarshal(XMLPost xmlPost) throws Exception {
StringWriter sw = new StringWriter();
JAXBContext jaxbContext = JAXBContext.newInstance(XmlPost.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.marshal(xmlPost, sw);
return sw.toString();
}
@Override
public XMLPost marshal(String xmlPost) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(XMLPost.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
return (XMLPost) jaxbUnmarshaller.unmarshal(new StringReader(xmlPost));
}
}你能发布你得到的错误吗?@AdamRosini我没有得到错误,只是在我的请求类中,XMLPost是一个空字符串,而我希望是一个包含xml的字符串
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="Report" minOccurs="0">
<xs:complexType>
<xs:sequence>
<!-- ... Report type definition ... -->
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Status" minOccurs="0">
<xs:complexType>
<xs:sequence>
<!-- ... Status type definition ... -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
@XmlElement(name="XMLPost")
private Object xmlPost;
<element name="XMLPost" type="xs:anyType" />
public class XmlPostStringAdapter extends XmlAdapter<XMLPost, String> {
@Override
public String unmarshal(XMLPost xmlPost) throws Exception {
StringWriter sw = new StringWriter();
JAXBContext jaxbContext = JAXBContext.newInstance(XmlPost.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.marshal(xmlPost, sw);
return sw.toString();
}
@Override
public XMLPost marshal(String xmlPost) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(XMLPost.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
return (XMLPost) jaxbUnmarshaller.unmarshal(new StringReader(xmlPost));
}