`
zhaoyx
  • 浏览: 21290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

三步解决JAXB生成XML包含CDATA问题—JAVA编程

阅读更多

废话不多说,写此文档的目的就是为了帮助java开发者,解决利用JAXB生成XML时,XML中带有CDATA问题。

 

分三步走:

 

 

首先创建适配器类:CDataAdapter.java

 

package com.zhaoyx;

import javax.xml.bind.annotation.adapters.XmlAdapter;

//有时候 Java 类不能自然映射到自己所需的 XML 形式,

//这时需要编写自己的适配器类,通过注解绑定到javabean的成员变量上,

//在运行的时候jaxb框架自动会适配你所编写的适配器类的方法,

//CDataAdapter.marshal(String str),将javabean的成员变量的value值

//转变成你想要的形式。

public class CDataAdapter extends XmlAdapter<String, String> {

//从javabean到xml的适配方法

    @Override
    public String marshal(String str) throws Exception {
        return "<![CDATA[" + str+ "]]>";
    }
   

//从xml到javabean的适配方法
    @Override
    public String unmarshal(String str) throws Exception {
        return str;
    }
}

 

 

其次创建JAXB生成XML的工具类:JaxbToXmlUtil.java

 

package com.zhaoyx;

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

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

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

//这里用到了JAXB的核心类和方法,不懂可以去查看下JAXB基础应用,

//这里只做关键解释。

public class JaxbToXmlUtil {

    public static String convertToXml(Object obj, String encoding) {
        String result = null;
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

//去掉生成xml的默认报文头。
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

//转换所有的适配字符,包括xml实体字符&lt;和&gt;,xml实体字符在好多处理xml

//的框架中是处理不了的,除非序列化。
            marshaller.setProperty("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
                    new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ch, int start,int length, boolean isAttVal,
                        Writer writer) throws IOException {
                    writer.write(ch, start, length);
                }
            });

            StringWriter writer = new StringWriter();

//添加自己想要的xml报文头
            writer.write("<?xml version=\'1.0\' encoding=\'" + encoding + "\'?>\n");
            marshaller.marshal(obj, writer);
            result = writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }

        return result;
    }
}

 

 

最后创建用于转换成XML文件的javabean:Root.java

 

package com.zhaoyx;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

//绑定自己的适配器类,适配希望包含在CData数据块中的javabean成员变量。

//这里的空值是为了测试,无其他涵义。

    @XmlJavaTypeAdapter(CDataAdapter.class)
    private String name = "";

    @XmlJavaTypeAdapter(CDataAdapter.class)
    private String surname;

    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

 

上面三步就可以解决利用JAXB生成XML时,XML中包含CDATA数据块的问题。

 

 

 

下面是用于测试的类:JaxbTest.java

 

package com.zhaoyx;


public class JaxbTest {

public static void main(String[] arg) {

 Root root = new Root();
 root.setId("ddd");
 root.setSurname("jiiii");

//由于在javabean中赋值为空,这句可以不要,也可以去掉javabean中的赋空值语句
 root.setName("");
 String str = JaxbToXmlUtil.convertToXml(root, "GBK");
 System.out.println(str);
 }

}

 

 

控制台输出结果:

<?xml version='1.0' encoding='GBK'?>
<root>
    <name><![CDATA[]]></name>
    <surname><![CDATA[jiiii]]></surname>
    <id>ddd</id>
</root>

 

如有疑问请提出,我会及时回复,多多交流!

分享到:
评论
4 楼 ajupiter 2017-06-12  
自己回复下:需要使用jre,当初出错是因为我使用了jdk带的jre

ajupiter 写道
楼主好,我的一个相似diamagnetic,import语句如下:
package web.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

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

报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project web: Compilation failure: Compilation failure:
[ERROR] /C:/Code/Java/TestFramework/webTestFrame/src/main/java/web/util/XMLBeanConverUtil.java:[18,44] 程序包com.sun.xml.internal.bind.marshaller不存在
[ERROR] /C:/Code/Java/TestFramework/webTestFrame/src/main/java/web/util/XMLBeanConverUtil.java:[91,40] 找不到符号
[ERROR] 符号:   类 CharacterEscapeHandler
[ERROR] 位置: 类 web.util.XMLBeanConverUtil
[ERROR] /C:/Code/Java/TestFramework/webTestFrame/src/main/java/web/util/XMLBeanConverUtil.java:[91,84] 找不到符号

所以想问下,这个marshaller包是java自带的吗?如何解决我的问题?

3 楼 ajupiter 2017-06-12  
楼主好,我的一个相似diamagnetic,import语句如下:
package web.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

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

报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project web: Compilation failure: Compilation failure:
[ERROR] /C:/Code/Java/TestFramework/webTestFrame/src/main/java/web/util/XMLBeanConverUtil.java:[18,44] 程序包com.sun.xml.internal.bind.marshaller不存在
[ERROR] /C:/Code/Java/TestFramework/webTestFrame/src/main/java/web/util/XMLBeanConverUtil.java:[91,40] 找不到符号
[ERROR] 符号:   类 CharacterEscapeHandler
[ERROR] 位置: 类 web.util.XMLBeanConverUtil
[ERROR] /C:/Code/Java/TestFramework/webTestFrame/src/main/java/web/util/XMLBeanConverUtil.java:[91,84] 找不到符号

所以想问下,这个marshaller包是java自带的吗?如何解决我的问题?
2 楼 pwpw1218 2017-05-26  
刚刚的代码有点问题,应该是
// 默认的CharacterEscapeHandler
					// 对<>等字符进行了处理,所有使用自定义的CharacterEscapeHandler
					out.write(ch,start,length);
1 楼 pwpw1218 2017-05-26  
marshaller.setProperty("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
                    new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ch, int start,int length, boolean isAttVal,
                        Writer writer) throws IOException {
                    writer.write(ch, start, length);
                }
            });


这个地方最好是该为:
marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {

				@Override
				public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
					// 默认的CharacterEscapeHandler
					// 对<>等字符进行了处理,所有使用自定义的CharacterEscapeHandler
					out.write(ch);
				}

			});


不然报java.lang.RuntimeException: javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler value:

相关推荐

    jaxb生成XML例子

    JAXB (Java Architecture for XML Binding) 是 Java 中用于对象到XML以及XML到对象转换的API。它使得开发者能够轻松地将Java对象模型映射到XML文档,并反之亦然。在给定的例子中,我们将深入理解如何使用JAXB注解来...

    JAXB 生成XML文件

    在Java应用程序中,JAXB使得处理XML数据变得更加便捷,无需编写大量手动转换代码。 JAXB的核心概念包括以下几点: 1. **数据绑定**:JAXB提供了一种机制,可以将Java类和XML Schema定义之间的映射关系自动创建。这...

    JAVA JAXB 解析XML嵌套子节点为字符串

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个标准的API,用于将XML文档与Java对象之间进行互相转换。这个技术对于处理XML数据,尤其是解析和生成XML文档非常有用。当我们面临XML文档中存在嵌套子...

    JAXB工具类 xml转为java对象 java对象转为xml

    Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得在Java应用程序中使用XML数据变得更加方便,无需手动编写大量的转换代码。本教程将详细介绍JAXB如何实现...

    利用JAXB进行xml和javabean之间转换

    如果不希望手动添加注解,可以使用JAXB的绑定工具(如`xjc`)从XML Schema (XSD)文件生成对应的Java类。这一步骤将创建带有正确注解的Java类,以便JAXB理解XML结构。 (3) **实例化Java对象** 创建Java对象并填充...

    用JAXB生成一个XML

    本文将详细介绍如何利用JAXB来从一个XML模式(Schema)生成Java类,并最终构建出符合该模式的XML文档。 #### 二、准备工作 为了使用JAXB从XML模式中生成Java类,首先需要确保以下工具和库已经正确配置: 1. **...

    JAXB 利用xsd文件生成java类

    JAXB (Java Architecture for XML Binding) 是Java平台上的一个标准,用于将XML文档与Java对象之间进行绑定,实现XML数据的解析和序列化。在Java开发中,JAXB提供了一种方便的方式,允许开发者通过XML Schema (XSD) ...

    jaxb解析生成xml

    Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准技术。它允许我们将XML文档转换为Java对象,反之亦然,使得数据交换变得更加简单。在Java开发中,JAXB是处理XML数据...

    xml转javaBean,javaBean转xml,xml标签大小写问题,以及对xml特殊符号的处理

    本文将深入探讨XML与JavaBean之间的转换、XML标签的大小写规则、XML特殊符号的处理以及CDATA的生成。 1. XML转JavaBean: 在Java编程中,XML数据经常需要转换为Java对象以便于操作。这一过程通常通过XML解析器来...

    使用jaxb根据xsd生成xml文档

    **使用JAXB根据XSD生成XML文档** ...这个过程包括创建XSD文件、生成Java类、配置JAXB绑定、创建和填充Java对象,最后使用`Marshaller`生成XML文档。了解并熟练掌握这一流程,能够极大地提高XML处理的效率和准确性。

    通过JAXB实现完成java对象和xml的互相转换

    Java Architecture for XML Binding (JAXB) 是一个Java标准,它提供了在Java对象和XML文档之间进行自动转换的能力。这项技术极大地简化了XML数据处理,使得开发者可以方便地将Java对象序列化为XML,或者从XML数据中...

    webservice之使用jaxb把xml转换Object或把对象转换成xml文件

    JAXB是Java平台标准版(Java SE)的一部分,提供了一种自动的方式来绑定XML Schema到Java类,使得XML文档可以被Java对象解析,同时Java对象也可以被序列化为XML文档。这种机制极大地简化了XML数据处理,尤其是在...

    JAXB完成XML和Java对象的互转

    该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用...

    jaxb解析xml

    JAXB (Java Architecture for XML Binding) 是一种基于 Java 的 XML 绑定技术,主要功能是根据 DTD 或者 XML Schema 将 XML Element 转化为 Java 类。JAXB 将 XML 文本流转化为 Java Object,把 XML Processing 转化...

    jaxb (XML操作)

    **JAXB(Java Architecture for XML Binding)** 是Java平台中用于处理XML的一种强大的工具,它提供了将XML文档与Java对象之间的映射,从而方便XML数据的解析和生成。通过JAXB,开发者可以轻松地实现XML数据到Java...

    java 使用 JAXB 将xml转换为 bean 包含xml和dto和读取文件的util类

    Java中的JAXB(Java Architecture for XML Binding)是一个用于在Java对象和XML文档之间进行映射的标准API。这个技术使得开发者可以方便地将XML数据转换为Java对象,反之亦然。在给定的压缩包文件中,可能包含了实现...

    JAXB与xml相互转换实例

    Java Architecture for XML Binding(JAXB)是Java平台上的一个标准技术,它允许开发者在XML文档和Java对象之间进行无缝转换。这项技术的核心理念是通过自动的编译过程,将XML Schema(XSD)定义的数据结构映射为...

    JAXB技术实现xml与java对象互相转化代码教程

    使用java jdk的JAXB技术实现xml与java对象互相转化代码教程: JDK中JAXB相关的重要Class和Interface:(来源于百度百科JAXB) •JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 •Marshaller接口,将Java...

Global site tag (gtag.js) - Google Analytics