jaxb不能直接生成带有CDATA区域的xml,找了好多的文章,测试类如下:
--------类(从网上找的一个类)------
package com;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class People {
public String id="001";
public String name="灰太狼";
public int age=26;
}
------------借鉴JaxbCDATASample.java----------------
package com;
import java.io.File;
import java.io.PrintStream;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.sax.SAXResult;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
public class JaxbCDATASample {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
// unmarshal a doc
JAXBContext jc = JAXBContext.newInstance(People.class);
Unmarshaller u = jc.createUnmarshaller();
File f = new File("src/people.xml");
Object o = u.unmarshal(f);
// create a JAXB marshaller
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
// get an Apache XMLSerializer configured to generate CDATA
XMLSerializer serializer = getXMLSerializer();
// marshal using the Apache XMLSerializer
SAXResult result = new SAXResult( serializer.asContentHandler() );
m.marshal(o, result);
// System.out.println();
// m.getNode(o);
//System.out.println("===="+ ContentHandler);
}
private static XMLSerializer getXMLSerializer() {
// configure an OutputFormat to handle CDATA
OutputFormat of = new OutputFormat();
// specify which of your elements you want to be handled as CDATA.
// The use of the '^' between the namespaceURI and the localname
// seems to be an implementation detail of the xerces code.
// When processing xml that doesn't use namespaces, simply omit the
// namespace prefix as shown in the third CDataElement below.
of.setCDataElements(
new String[] { "^id", //
"^name", //
"^age" }); //
// set any other options you'd like
of.setPreserveSpace(true);
of.setIndenting(true);
StringWriter writer = new StringWriter();
// create the serializer
XMLSerializer serializer = new XMLSerializer(of);
serializer.setOutputByteStream(System.out);
return serializer;
}
}
-----------------------------------------------------
最后运行结果打印到控制台:
< ?xml version="1.0" encoding="UTF-8"?>
< people><id><![CDATA[001]]></id><name><![CDATA[灰太狼]]></name><age><![CDATA[26]]></age></people>
--------类(从网上找的一个类)------
package com;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class People {
public String id="001";
public String name="灰太狼";
public int age=26;
}
------------借鉴JaxbCDATASample.java----------------
package com;
import java.io.File;
import java.io.PrintStream;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.sax.SAXResult;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
public class JaxbCDATASample {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
// unmarshal a doc
JAXBContext jc = JAXBContext.newInstance(People.class);
Unmarshaller u = jc.createUnmarshaller();
File f = new File("src/people.xml");
Object o = u.unmarshal(f);
// create a JAXB marshaller
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
// get an Apache XMLSerializer configured to generate CDATA
XMLSerializer serializer = getXMLSerializer();
// marshal using the Apache XMLSerializer
SAXResult result = new SAXResult( serializer.asContentHandler() );
m.marshal(o, result);
// System.out.println();
// m.getNode(o);
//System.out.println("===="+ ContentHandler);
}
private static XMLSerializer getXMLSerializer() {
// configure an OutputFormat to handle CDATA
OutputFormat of = new OutputFormat();
// specify which of your elements you want to be handled as CDATA.
// The use of the '^' between the namespaceURI and the localname
// seems to be an implementation detail of the xerces code.
// When processing xml that doesn't use namespaces, simply omit the
// namespace prefix as shown in the third CDataElement below.
of.setCDataElements(
new String[] { "^id", //
"^name", //
"^age" }); //
// set any other options you'd like
of.setPreserveSpace(true);
of.setIndenting(true);
StringWriter writer = new StringWriter();
// create the serializer
XMLSerializer serializer = new XMLSerializer(of);
serializer.setOutputByteStream(System.out);
return serializer;
}
}
-----------------------------------------------------
最后运行结果打印到控制台:
< ?xml version="1.0" encoding="UTF-8"?>
< people><id><![CDATA[001]]></id><name><![CDATA[灰太狼]]></name><age><![CDATA[26]]></age></people>