如何获取 XmlType 的字符串表示形式?

2022-09-02 12:29:42

是否可以将 javax.xml.bind.annotation.XmlType 转换为 XML 的字符串表示形式?

例:

以下类 Req 来自第三方库,因此我无法重写 toString() 方法。

@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
@javax.xml.bind.annotation.XmlType(name = "req", propOrder = {"myDetails", "customerDetails"})
public class Req  {
...
}

在我的应用程序中,我只想获取XML的字符串表示形式,以便我可以将其记录到文件中:

<Req>
    <MyDetails>
    ...
    </MyDetails>
    <CustomerDetails>
    ...
    </CustomerDetails>
</Req>

当我尝试使用 JAXB 和 Marshall 转换为 XML 字符串时:

JAXBContext context = JAXBContext.newInstance(Req.class);
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.marshal(instanceOfReq, sw);
String xmlString = sw.toString();

我得到以下异常:

javax.xml.bind.MarshalException
    - with linked exception:
    [com.sun.istack.SAXException2: unable to marshal type "mypackage.Req" as an element because it is missing an @XmlRootElement annotation]

我看了一下第三方库中的其他类,它们都没有使用@XmlRootElement注释。有什么办法可以解决这个问题吗?


答案 1

您可以使用 JAXB 并将其编组为 xml 字符串

JAXBContext context = JAXBContext.newInstance(Req.class);
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.marshal(instanceOfReq, sw);

String xmlString = sw.toString();

答案 2

添加到Bala R指示的内容中,如果您的JAXB元素没有@xmlrootelement

JAXBContext context = JAXBContext.newInstance(YourClass.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            StringWriter sw = new StringWriter();
            JAXBElement jx = new JAXBElement(new QName("YourRootElement"), YourClass.class, input);
            marshaller.marshal(jx, sw);
            String xmlString = sw.toString();

这里也说明了这一点


推荐