从jaxb生成的xml中删除standalone =“yes”

时间:2013-01-04 06:54:37

标签: java xml formatting jaxb jaxb2

public final String getMessage() {
            JAXBContext jaxbContext;
            StringWriter sw = new StringWriter();
            try {
                jaxbContext = JAXBContext.newInstance(Login.class);        
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

                jaxbMarshaller.setProperty("jaxb.encoding", "ISO-8859-1");                      
                        jaxbMarshaller.marshal(this, sw);
            } catch (JAXBException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return sw.toString();
        }

这是我正在使用的代码..我得到的输出如下。

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>

这里我想删除standalone =“yes”并希望输出为

<?xml version="1.0" encoding="ISO-8859-1"?>

我查了链接 JAXB - Remove 'standalone="yes"' from generated XML 但这里的答案正在删除完整的

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

部分

我不希望这样......

请帮帮我..

2 个答案:

答案 0 :(得分:6)

您的问题需要解决几个问题:

问题#1 - 编码

当输出为"jaxb.encoding"时,集合时OutputStream属性直接影响编码。如果您使用的输出(例如Writer)可以用来处理自己的编码,那么您需要确保将其作为Writer的一部分来处理。

了解更多信息

问题#2 - standalone="yes"

您可以创建一个StAX(JSR-173)XMLStreamWriter来包装您的StringWriter以获取XML输出并编组。

import java.io.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.stream.*;

@XmlRootElement
public class Login {

    private JAXBContext jaxbContext;
    private XMLOutputFactory xmlOutputFactory;

    public Login() {
        try {
            jaxbContext = JAXBContext.newInstance(Login.class);
            xmlOutputFactory = XMLOutputFactory.newFactory();
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Login demo = new Login();
        System.out.println(demo.getMessage());
    }

    public final String getMessage() {
        try {
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty("jaxb.encoding", "ISO-8859-1");
            jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(baos, (String) jaxbMarshaller.getProperty(Marshaller.JAXB_ENCODING));
            xmlStreamWriter.writeStartDocument((String) jaxbMarshaller.getProperty(Marshaller.JAXB_ENCODING), "1.0");
            jaxbMarshaller.marshal(this, xmlStreamWriter);
            xmlStreamWriter.writeEndDocument();
            xmlStreamWriter.close();
            return new String(baos.toByteArray());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

<强>输出

<?xml version="1.0" encoding="ISO-8859-1"?><login></login>

替代方法

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

还有其他JAXB(JSR-222)提供程序(如MOXy)不会输出standalone="yes"作为您可以使用的XML输出的一部分。

答案 1 :(得分:0)

经过一番努力,我找到了解决此问题的简单方法。通过以下方式禁用自动生成的标题:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);

这将禁用自动生成的标题,现在我们可以像这样添加自定义标题:

marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");

整个代码看起来像:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");

这种方法就像黄油一样。