Java JAXB如何将嵌套的xml元素解组为字符串?

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"

我正在尝试将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")
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));
  }