9
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"?>

生成されたXMLから「standalone="yes"」を削除するリンクをチェック しましたが、ここでの回答は完全に削除されています

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

私はそれを望んでいません。

4

2 に答える 2

8

あなたの質問で対処する必要があるいくつかの問題があります:

問題#1-エンコーディング

setの場合の"jaxb.encoding"プロパティは、出力が。の場合のエンコーディングに直接影響しますOutputStreamWriter独自のエンコーディングを処理する責任がある出力(など)を使用している場合は、それをの一部として処理することを確認する必要がありますWriter

詳細については

問題#2-standalone="yes"

StAX(JSR-173)XMLStreamWriterを作成して、XML出力用にラップStringWriterし、それにマーシャリングすることができます。

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)エキスパートグループのメンバーです。

standalone="yes"使用できるXML出力の一部として出力されないMOXyなどの他のJAXB(JSR-222)プロバイダーがあります。

于 2013-01-04T11:33:22.273 に答える
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\" ?>");
于 2021-06-16T12:23:09.417 に答える