Java JAXB如何将XML和XML字符串附加到XML元素中?

Java JAXB如何将XML和XML字符串附加到XML元素中?,java,xml,jaxb,Java,Xml,Jaxb,我试图添加一个XML元素,另一个XML是字符串。当我生成的XML文件编码不正确时,问题就出现了,它使我产生了一些值​​< > HTML JAXBContext jaxbContext = JAXBContext.newInstance(ExpedienteType.class); String XMLDatosEspecificos = "<![CDATA[" + XMLDatosEspecificos + "]]>"; expedienteType.setDATOSESPECI

我试图添加一个XML元素,另一个XML是字符串。当我生成的XML文件编码不正确时,问题就出现了,它使我产生了一些值​​< > HTML

JAXBContext jaxbContext = JAXBContext.newInstance(ExpedienteType.class);

String XMLDatosEspecificos = "<![CDATA[" + XMLDatosEspecificos + "]]>";

expedienteType.setDATOSESPECIFICOS(XMLDatosEspecificos);

Marshaller marshaller = jaxbContext.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);

marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");

JAXBElement<ExpedienteType> jaxbElement = new JAXBElement<ExpedienteType>(
new QName("", "Expediente"), ExpedienteType.class, expedienteType);

ByteArrayOutputStream os = new ByteArrayOutputStream();

marshaller.marshal(jaxbElement, os);

File f = new File("file.xml");
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(os.toByteArray());
os.close();
fos.close();
JAXBContext-JAXBContext=JAXBContext.newInstance(便利类型.class);
字符串xmldataosecificos=“”;
便利类型。SetDatosSpecifics(XMLDatosSpecifics);
Marshaller=jaxbContext.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
setProperty(marshaller.JAXB_编码,“UTF-8”);
JAXBElement=new JAXBElement(
新的QName(“,”方便“),方便类型.class,方便类型);
ByteArrayOutputStream os=新建ByteArrayOutputStream();
marshaller.marshall(jaxbElement,os);
文件f=新文件(“File.xml”);
f、 createNewFile();
FileOutputStream fos=新的FileOutputStream(f);
fos.write(os.toByteArray());
os.close();
fos.close();
这里是XML的结果

<DATOS_ESPECIFICOS>&lt;![CDATA[&lt;nombre&gt;pepito&lt;/nombre&gt;&lt;apellidos&gt;grillo&lt;/apellidos&gt;]]>;</DATOS_ESPECIFICOS>
![CDATA[nombrepepito/NombrePellidosGrillo/apellidos]>;
我将得到的结果是

<DATOS_ESPECIFICOS><![CDATA[<nombre>pepito</nombre><apellidos>grillo</apellidos>]]></DATOS_ESPECIFICOS>
pepitogrillo]>

详细说明我的注释-默认情况下,JAXB是您在元素上设置的任何文本

您可以使用中描述的解决方案之一禁用转义


然而,我发现您真正需要的只是在CDATA区域中输入文本。这可以使用这里描述的解决方案之一来实现:

详细说明我的注释-默认情况下,JAXB是您在元素上设置的任何文本

您可以使用中描述的解决方案之一禁用转义


然而,我发现您真正需要的只是在CDATA区域中输入文本。这可以使用此处描述的解决方案之一实现:

最好的解决方案是我实现的解决方案。还有更多的方法可以创建一个处理程序,该处理程序在不做任何更改的情况下编写所有发生的事情,以便在不更改任何字符的情况下编写文本

import java.io.IOException;
import java.io.Writer;

import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

public class MyEscapeHandler implements CharacterEscapeHandler {

    @Override
    public void escape(char[] ch, int start, int length, boolean isAttVal,
            Writer out) throws IOException {
        out.write(ch, start, length);
    }

}
在实现XML创建的类中添加了它

JAXBContext jaxbContext = JAXBContext
                        .newInstance(ExpedienteType.class);

                Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                        true);
                marshaller.setProperty(Marshaller.JAXB_ENCODING,
                        "ISO-8859-1");
                StringBuffer strBuff = new StringBuffer("");
                strBuff.append("PLAT2_");
                strBuff.append(expedienteType.getNEXPEDIENTE().replace("/", "_"));


                CharacterEscapeHandler escapeHandler = new MyEscapeHandler();
                marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", escapeHandler); 

                JAXBElement<ExpedienteType> jaxbElement = new JAXBElement<ExpedienteType>(
                        new QName("", "Expediente"), ExpedienteType.class,
                        expedienteType);
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                marshaller.marshal(jaxbElement, os);
JAXBContext JAXBContext=JAXBContext
.newInstance(便利类型.class);
Marshaller=jaxbContext.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,
正确的);
setProperty(marshaller.JAXB_编码,
“ISO-8859-1”);
StringBuffer strBuff=新的StringBuffer(“”);
strBuff.append(“平台2”);
strBuff.append(便利类型.getNEXPEDIENTE().replace(“/”,“”);
CharacterEscapeHandler escapeHandler=新的MyEscapeHandler();
setProperty(“com.sun.xml.bind.characterEscapeHandler”,escapeHandler);
JAXBElement=new JAXBElement(
新QName(“,”方便“),方便类型.class,
(四种类型);
ByteArrayOutputStream os=新建ByteArrayOutputStream();
marshaller.marshall(jaxbElement,os);
最终的XML是完美创建的

 <DATOS_ESPECIFICOS><![CDATA[<nombre>pepito</nombre><apellidos>grillo</apellidos>]]></DATOS_ESPECIFICOS>
pepitogrillo]>

最好的解决方案是我实施的解决方案。还有更多的方法可以创建一个处理程序,该处理程序在不做任何更改的情况下编写所有发生的事情,以便在不更改任何字符的情况下编写文本

import java.io.IOException;
import java.io.Writer;

import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

public class MyEscapeHandler implements CharacterEscapeHandler {

    @Override
    public void escape(char[] ch, int start, int length, boolean isAttVal,
            Writer out) throws IOException {
        out.write(ch, start, length);
    }

}
在实现XML创建的类中添加了它

JAXBContext jaxbContext = JAXBContext
                        .newInstance(ExpedienteType.class);

                Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                        true);
                marshaller.setProperty(Marshaller.JAXB_ENCODING,
                        "ISO-8859-1");
                StringBuffer strBuff = new StringBuffer("");
                strBuff.append("PLAT2_");
                strBuff.append(expedienteType.getNEXPEDIENTE().replace("/", "_"));


                CharacterEscapeHandler escapeHandler = new MyEscapeHandler();
                marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", escapeHandler); 

                JAXBElement<ExpedienteType> jaxbElement = new JAXBElement<ExpedienteType>(
                        new QName("", "Expediente"), ExpedienteType.class,
                        expedienteType);
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                marshaller.marshal(jaxbElement, os);
JAXBContext JAXBContext=JAXBContext
.newInstance(便利类型.class);
Marshaller=jaxbContext.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,
正确的);
setProperty(marshaller.JAXB_编码,
“ISO-8859-1”);
StringBuffer strBuff=新的StringBuffer(“”);
strBuff.append(“平台2”);
strBuff.append(便利类型.getNEXPEDIENTE().replace(“/”,“”);
CharacterEscapeHandler escapeHandler=新的MyEscapeHandler();
setProperty(“com.sun.xml.bind.characterEscapeHandler”,escapeHandler);
JAXBElement=new JAXBElement(
新QName(“,”方便“),方便类型.class,
(四种类型);
ByteArrayOutputStream os=新建ByteArrayOutputStream();
marshaller.marshall(jaxbElement,os);
最终的XML是完美创建的

 <DATOS_ESPECIFICOS><![CDATA[<nombre>pepito</nombre><apellidos>grillo</apellidos>]]></DATOS_ESPECIFICOS>
pepitogrillo]>

要生成CDATA数据块,请参阅要生成CDATA数据块,请参阅要生成CDATA数据块,请参阅